我是新手,也是CDI世界的新手,在工作中我得到的第一个任务是找出一种控制CDI上传的方法。
我们同时使用了 EJB 3.1
和 CDI 1.0
,因为它们由不同的容器控制,所以我们可以使用 @Startup
和 @Singleton
注解来控制 EJB 管理的 Bean 的上升顺序。
但是,我在类中声明的 @Inject
CDI bean 却是 null,因为 CDI 容器尚未启动。
我已经试了好几天了,寻找解决方案,但我在这里找到的一个解决方案(链接)仍然是 null。
我们使用的是 Java EE 6,并在 WebSphere Application Server 8 上运行应用程序。
请问,如果您能帮助我找到一种无论 EJB 如何都能控制 CDI 上传的方法,那就太好了。
以下是示例代码:
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();
}
}