我有一个场景,我需要在应用程序启动时加载一个 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)
不是真正的异常消息。特别是我也没有收到任何"初始化"日志条目。当我注释掉dataStore.getReports()调用时,一切正常,并且bean以正确的顺序构建(生成了"初始化"消息)。包括数据存储方法调用导致上述错误,并以某种方式抑制所有日志输出。
我正在使用Weblogic 12c。
我弄清楚了导致错误的原因。它是@RolesAllowed
声明,由于安全上下文为空而阻塞方法调用,在 Bean 中执行时未在方法@PostConstruct
@Startup
设置(来自 EJB 3.1 规范,第 4.3.4 章:PostConstruct 生命周期回调拦截器方法在未指定的安全上下文中执行)。
使其工作所需的只是向调用的方法添加@PermitAll
:
@PermitAll
public List<Report> getReports() {
...
}
错误是如此错误,我决定把这个案例放在这里,因为我无法谷歌答案。
就我而言,我使用的是 SpringLoader.java 类,它是一个加载 Spring 配置的@Singleton。Spring 配置了 Quartz 调度程序,该调度程序正在尝试访问其数据库表(作为某些事务的一部分)。
所以就我而言,它帮助将以下行添加到这个 SpringLoader 类中:@TransactionManagement(TransactionManagementType.BEAN)
之后,将显示一些更有意义的错误消息:ORA-00942:表或视图不存在。
顺便说一句:还值得添加这一行:@ConcurrencyManagement(ConcurrencyManagementType.BEAN)