@辛格尔顿豆失败的,因为不期望交易状态初始化(@Singleton bean failed to i

2019-09-23 03:04发布

我曾在我需要一个豆(ReportManager)在应用程序启动时加载的情景,所以它可以安排执行(由数据存储豆从数据库调查)报告。

周围的Googling我发现@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)

没有真正heplful异常消息。 特别是我还没有得到任何“初始化”日志条目。 当我注释掉dataStore.getReports()调用一切工作正常和豆类按照正确的顺序构建(制作“初始化”的消息)。 包括数据存储的方法调用是导致上述错误并在某种程度上supressing所有的日志输出。

我使用的Weblogic 12C。

Answer 1:

最后,我已经想通了什么导致错误。 这是@RolesAllowed声明这是由于空安全的背景下,没有设置阻止方法调用@PostConstruct时执行的方法@Startup豆(从EJB 3.1规范,CH 4.3.4 :在PostConstruct生命周期回调拦截方法执行中未指定的安全上下文)。

需要什么使它的工作只是添加@PermitAll被调用的方法:

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

错误是如此misleasing我决定把这里这种情况下,我不能谷歌的答案。



Answer 2:

就我而言,我使用SpringLoader.java类,这是加载Spring配置一个@Singleton。 春天配置了Quartz调度正试图访问其数据库表(S)(如一些交易的一部分)。

所以在我的情况下,它帮助将下面的行这个SpringLoader类:@TransactionManagement(TransactionManagementType.BEAN)

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

BTW:它也是值得加入这一行:@ConcurrencyManagement(ConcurrencyManagementType.BEAN)



文章来源: @Singleton bean failed to initialize because of not expected transaction status