@Resource注释成员未注入 - 错误的代码或错误?

时间:2010-04-30 16:11:10

标签: java servlets annotations websphere

我在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,如果它应该工作那么我想这是一个错误?任何人都可以确认吗?

2 个答案:

答案 0 :(得分:2)

认真。 Bug

  

Webcontainer代码正在初始化   注入目标之前的servlet   从注入引擎中检索。   因此,如果servlet初始化   取决于注射   资源,问题可能发生。

因为在加载任何servlet之前调用了contextInitialized,所以必须应用同样的问题。

答案 1 :(得分:1)

另一件需要考虑的事情是资源注入只适用于容器创建的对象,所以即使资源已经在contextInitialized调用中,这也行不通,因为它是你的代码创建的在ResourceListenerTargetTest实例中,WAS不会知道您打算注入资源。

或者至少我希望它没有。否则,WAS JVM必须拦截每个对象的创建,并确保特定对象不需要注入,这对性能有害。

类似/相关原则适用于AOP,当在对象内部代理的对象上调用方法时,方法调用不会被拦截(如果这是有意义的)。