3

アプリケーションの起動時に1つのBean(ReportManager)をロードして、レポートの実行をスケジュールできるようにするシナリオがありました(DataStore Beanによってデータベースからポーリングされます)。

グーグルで調べてみると、@ Singleton、@ Startup、@DependsOnアノテーションが見つかりました。これらは次のように使用しています。

@Singleton
@Startup
@DependsOn("DataStore")
public class ReportManager {
    @EJB
    DataStore dataStore;

    @PostConstruct
    public void scheduleReports() {
       logger.log("INITIALIZED");
       List<Report> reports = dataStore.getReports();
       ....
    }
}

@Singleton
@RolesAllowed("user") //I had security checks implemented like that beforehand
public class DataStore {
    @PostConstruct
    public void initialize() {
        logger.log("INITIALIZED");
    }

    public List<Report> getReports() {
        ...
    }
}

問題は、展開時に非常に奇妙な例外が発生することでした。

<2012-09-27 14:04:15 CEST> <Warning> <Deployer> <BEA-149004> <Failures were detected while initiating deploy task for application "app".>
<2012-09-27 14:04:15 CEST> <Warning> <Deployer> <BEA-149078> <Stack trace for message 149004
weblogic.application.ModuleException: Exception starting module: EJBModule(app-ejb-1.0-SNAPSHOT.jar)

Unable to deploy EJB: ReportManager from app-ejb-1.0-SNAPSHOT.jar:

Singleton ReportManager(Application: app, EJBComponent: app-ejb-1.0-SNAPSHOT.jar) failed to initialize.

   at weblogic.ejb.container.deployer.EJBModule.start(EJBModule.java:592)
 .....

Caused By: weblogic.ejb.container.InternalException: Transaction marked rollback or not expected transaction status: 1
   at weblogic.ejb.container.manager.SingletonSessionManager.postCallback(SingletonSessionManager.java:464)

本当に大げさな例外メッセージではありません。特に、「INITIALIZED」ログエントリも取得していませんでした。dataStore.getReports()呼び出しをコメントアウトすると、すべてが正常に機能し、Beanが適切な順序で構築されました(「INITIALIZED」メッセージが生成されました)。dataStoreメソッドの呼び出しを含めると、上記のエラーが発生し、何らかの形ですべてのログ出力が抑制されていました。

Weblogic12cを使用しています。

4

2 に答える 2

4

最後に、エラーの原因を突き止めました。これは、Beanで実行されたときにメソッドに@RolesAllowed設定されていない、空のセキュリティ コンテキストが原因でメソッド呼び出しをブロックしていた宣言でした ( EJB 3.1 仕様、ch. 4.3.4から: PostConstruct ライフサイクル コールバック インターセプタ メソッドは、未指定のセキュリティ コンテキストで実行されます)。 .@PostConstruct@Startup

それを機能させるために必要だったのは@PermitAll、呼び出されたメソッドへの追加だけでした:

@PermitAll
public List<Report> getReports() {
   ...
}

エラーは非常に誤解を招くものでした。答えをググることができなかったので、このケースをここに置くことにしました。

于 2012-09-27T12:38:34.853 に答える