Jakarta ee @由于不是预期的事务状态,Singleton bean未能初始化

Jakarta ee @由于不是预期的事务状态,Singleton bean未能初始化,jakarta-ee,transactions,weblogic,Jakarta Ee,Transactions,Weblogic,我有一个场景,在这个场景中,我需要在应用程序启动时加载一个bean(ReportManager),这样它就可以安排执行报告(由数据存储bean从数据库轮询) 通过谷歌搜索,我发现了@Singleton、@Startup和@DependsOn注释,我使用的注释如下: @Singleton @Startup @DependsOn("DataStore") public class ReportManager { @EJB DataStore dataStore; @Post

我有一个场景,在这个场景中,我需要在应用程序启动时加载一个bean(ReportManager),这样它就可以安排执行报告(由数据存储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() {
        ...
    }
}
@Singleton
@启动
@DependsOn(“数据存储”)
公共类报表管理器{
@EJB
数据存储;
@施工后
公共无效计划报告(){
logger.log(“已初始化”);
List reports=dataStore.getReports();
....
}
}
@独生子女
@RolesAllowed(“用户”)//我事先就做过这样的安全检查
公共类数据存储{
@施工后
公共无效初始化(){
logger.log(“已初始化”);
}
公共列表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)


最后我找出了错误的原因。正是
@RolesAllowed
声明阻止了方法调用,因为安全上下文为空,在
@PostConstruct
方法中执行
@Startup
bean时未设置该声明(来源:PostConstruct生命周期回调拦截器方法在未指定的安全上下文中执行)

使其工作所需的只是在调用的方法中添加
@PermitAll

@PermitAll
public List<Report> getReports() {
   ...
}
@PermitAll
公共列表getReports(){
...
}

这个错误是如此错误,我决定把这个案例放在这里,因为我无法用谷歌搜索答案。

在我的案例中,我使用的是SpringLoader.java类,它是一个加载Spring配置的@Singleton。Spring配置了Quartz调度器,该调度器正在尝试访问其DB表(作为某些事务的一部分)

因此,在我的例子中,它有助于向这个SpringLoader类添加以下行: @TransactionManagement(TransactionManagementType.BEAN)

之后,会显示一些更有意义的错误消息:ORA-00942:表或视图不存在

顺便说一句:它也值得添加这一行:
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)

在找到问题的原因(并创建了所需的Quartz DB表)后,我返回容器管理器事务,一切都很好。问题中没有提到拦截器。然后,通过引用有关拦截器安全上下文执行(未指定)的规范来证明答案的正确性。然后将@PermitAll添加到会话bean方法中,如果未指定,它与拦截器安全上下文有什么关系?这个答案毫无意义,除非你找到了依赖Weblogic行为的东西。