在EJB3.1中控制CDI启动的java
我是新来的,也不熟悉CDI世界,我在工作中的第一个任务就是找到一种控制CDI上传的方法
我们同时使用EJB 3.1
和CDI 1.0
,因为它们由不同的容器控制,所以我们可以通过使用@Startup
和@Singleton
注释来控制EJB管理的bean何时以及以何种顺序启动
但是我在类中声明的@Inject
cdibean是空的,因为CDI容器还没有启动
几天来,我一直在寻找解决方案,但我发现here不起作用(仍然是空的)
我们正在使用JavaEE6并在WebSphereApplicationServer8上运行应用程序
请,如果你能帮我找到一种方法来控制CDI在内部的上传,而不考虑EJB
下面是它的示例代码:
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
@Singleton
@Startup
public class BaseStartupLoader{
/**
* Default constructor.
*/
@Inject @MyStartup
BaseStartUp myStartup;
private static Logger m_logger = LoggerFactory.getLogger(BaseStartupLoader.class);
public BaseStartupLoader() {
}
@PostConstruct
public void init(){
String applicationName = null;
try {
applicationName = myStartup.getClass().getName();
myStartup.load();
} catch (IllegalAccessException e) {
m_logger.error("Faild to load data into preload system. "+e);
} catch (InstantiationException e) {
m_logger.error("Faild to load data into preload system. "+e);
} catch (ClassNotFoundException e) {
m_logger.error("Faild to load data into preload system - Class "+ applicationName + "Not found. "+e);
}
}
}
下面是BaseStartup接口:
public interface BaseStartUp {
public void load() throws IllegalAccessException, InstantiationException, ClassNotFoundException;
}
限定符和实现:
@Retention(RetentionPolicy.RUNTIME)
@Target ({ElementType.PARAMETER, ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
@Qualifier
@Dependent
public @interface MyStartup {
}
@MyStartup
public class MyStartUpLoader implements BaseStartUp {
@Inject
SomeConfigLoader config;
@Override
public void load() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
conifg.init();
}
}
# 1 楼答案
经过大量研究,我从IBM的同事那里得到了一些帮助,因为我们正在使用WebSphere Application Server,所以我可以添加一个JVM属性,名为:
“com.ibm.ws.cdi.immediate.ejb.start”=true
到管理控制台中的WAS,他将确保一旦我进入我创建的@startupbean中的EJB@PostConstruct方法,CDI容器将已经启动并运行,并且已经注入
它起作用了
以下是指向IBM站点中的问题和解决方案的链接:
http://www-01.ibm.com/support/docview.wss?uid=swg1PM62774
# 2 楼答案
可能需要再次检查CDI是否在应用程序需要的所有位置都已启用。尝试将此代码添加到
BaseStartupLoader
作为实验:如果
test
变量在@PostConstruct
中出现null,那么在声明BaseStartupLoader
的jar中可能没有启用CDI例如,如果在名为
orange.jar
的jar中声明了BaseStartupLoader
,而在名为yellow.jar
的jar中声明了MyStartUpLoader
,则这两个文件必须存在:orange.jar!/META-INF/beans.xml
yellow.jar!/META-INF/beans.xml
如果通过
META-INF/beans.xml
在两个JAR中正确启用了CDI,那么这就是容器中的错误。在调用@PostConstruct
之前,需要完成所有@Inject
点(对于启用CDI的JAR)。无论是否使用了@Startup
并且其中一个bean恰好是EJB,这都是正确的# 3 楼答案
看看德尔塔斯派克。有一个CDI控制模块,可以满足您现在的需求。我相信JavaEE7也应该解决这个问题