代码之家  ›  专栏  ›  技术社区  ›  brabster

@未注入资源注释成员-错误代码或错误?

  •  3
  • brabster  · 技术社区  · 14 年前

    我在servletContextListener的 contextInitialized(...) 方法,但成员始终为空。这是我的示例代码。

    倾听者:

    public void contextInitialized(ServletContextEvent sce) {
      System.err.println("In contextInitialised");
      new ResourceListenerTargetTest().executeMe(); 
    }
    

    资源列表目标:

    @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);
    }
    

    如果我切换注释并运行手动资源查找,它可以正常工作。

    @resource注释在contextinitialized方法中使用时是否应该这样工作?

    appserver是7.0.0.5,如果它是 应该 我想是虫子吧?有人能证实吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   beny23    14 年前

    另一件要考虑的事情是,资源注入只对容器创建的对象起作用,因此即使资源已经在ContextInitialized调用中,这也不会起作用,因为创建ResourceListenerTargetest实例的是您的代码不知道你打算给它注入资源。

    或者至少我希望它不需要,否则,was jvm将不得不截获每一个对象的创建,并确保特定对象不需要注入,这将损害性能。

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

        2
  •  2
  •   brabster    14 年前

    该死。 Bug .

    WebContainer代码正在初始化 注入目标之前的servlet是 从喷射引擎中取出。 因此,如果servlet初始化 依赖于注射 资源,可能会出现问题。

    因此,在加载任何servlet之前调用contextinitialized时,必须应用相同的问题。