jakarta-ee - @Singleton bean 初始化失败,因为不是预期的事务状态

标签 jakarta-ee transactions weblogic

我有一个场景,我需要在应用程序启动时加载一个 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 方法调用导致上述错误,并以某种方式抑制所有日志输出。

我正在使用 Weblogic 12c。

最佳答案

我终于弄清楚是什么导致了错误。这是 @RolesAllowed 声明由于空的安全上下文而阻止方法调用,在 @Startup 中执行时未在 @PostConstruct 方法中设置bean(来自 EJB 3.1 spec, ch. 4.3.4:PostConstruct 生命周期回调拦截器方法在未指定的安全上下文中执行。)。

让它工作所需的只是将 @PermitAll 添加到调用的方法中:

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

这个错误太误导了我决定把这个案例放在这里,因为我无法通过谷歌搜索答案。

关于jakarta-ee - @Singleton bean 初始化失败,因为不是预期的事务状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12621559/

相关文章:

hibernate - 记录 JDBC/Hibernate/JPA 事务隔离级别

java - 适用于 Java EE 的火力地堡

jakarta-ee - "Cannot use a method returning Unit as an Handler"在路由文件中收到此错误 - Play 2.0 Framework

mysql - 优化插入的最佳方法

sql - 你如何处理多线程的陈旧数据?

java - 为 Weblogic 集群中的节点启用调试

java - 应用程序服务器作业还是数据库作业?

java - 丢失日志 - log4j.xml 配置似乎被忽略 - Weblogic 9.2

mysql - 来自子句中的 JPA 子查询

java - Arquillian 集成测试在启用安全管理 (HTTPS) 的 Glassfish 4.1 容器上失败