我在ServletContextListener的contextInitialized(...)
方法中实例化的类中使用@Resource注释,但该成员始终为null。这是我的示例代码。
监听器:
public void contextInitialized(ServletContextEvent sce) {
System.err.println("In contextInitialised");
new ResourceListenerTargetTest().executeMe();
}
ResourceListenerTargetTest:
@Resource(name="MyJDBCResource")
private DataSource source;
public void executeMe() {
/*try {
InitialContext ictx = new InitialContext();
source = (DataSource)ictx.lookup("java:comp/env/MyJDBCResource");
} catch (NamingException e) {
e.printStackTrace();
}*/
System.err.println("source is " + source);
}
如果我切换注释并运行手动资源查找,它可以正常工作。
在ContextInitalized方法中使用@Resource注释是否可以这样工作?
Appserver是WAS 7.0.0.5,如果它应该工作那么我想这是一个错误?任何人都可以确认吗?
答案 0 :(得分:2)
认真。 Bug
Webcontainer代码正在初始化 注入目标之前的servlet 从注入引擎中检索。 因此,如果servlet初始化 取决于注射 资源,问题可能发生。
因为在加载任何servlet之前调用了contextInitialized,所以必须应用同样的问题。
答案 1 :(得分:1)
另一件需要考虑的事情是资源注入只适用于容器创建的对象,所以即使资源已经在contextInitialized调用中,这也行不通,因为它是你的代码创建的在ResourceListenerTargetTest实例中,WAS不会知道您打算注入资源。
或者至少我希望它没有。否则,WAS JVM必须拦截每个对象的创建,并确保特定对象不需要注入,这对性能有害。
类似/相关原则适用于AOP,当在对象内部代理的对象上调用方法时,方法调用不会被拦截(如果这是有意义的)。