将从Websphere共享库生成的bean注入EJB

时间:2015-10-01 08:48:24

标签: java-ee ejb websphere cdi

我有一个EJB会话bean,它注入从包装在jar文件中的类生成的Logger。 jar文件被添加到classpath。

package org.cdi.inject.test;

import javax.ejb.Stateless;
import javax.inject.Inject;

import org.apache.log4j.Logger;

@Stateless
public class MySessionBean{

  @Inject
  private Logger log;

}

生成Logger的类看起来像这样:

package org.cdi.inject.producer;

import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Singleton;

import org.apache.log4j.Logger;

@Singleton
public class LogProducer {

    @Produces
    public Logger getLogger(InjectionPoint ip){
        String declaringClass = ip.getMember().getDeclaringClass().getName();   
        return Logger.getLogger(declaringClass);
    }
}

MySessionBean被打包,EJB jar文件 MyEjb.jar 和类LogProducer打包在 bean-producer.jar 中。如上所述[{3}},这两个jar都包含META-INF目录,其中包含beans.xml

我使用的服务器是Websphere 8.0。我已经通过控制台直接部署了 MyEjb.jar ,并且 bean-producer.jar 被添加到shared library。共享库被添加到ejb jar的类路径中。

使用上述配置,注入失败并显示错误:

[10/1/15 12:56:53:762 GMT+05:30] 00000037 InjectInjecti E   CWOWB0102E: A JCDI error has occurred: Api type [org.apache.log4j.Logger] is not found with the qualifiers
Qualifiers: [@javax.enterprise.inject.Default()]
for injection into
 Field Injection Point, field :  private org.apache.log4j.Logger org.cdi.inject.producer.MySessionBean.log, Bean Owner : [1527619878,Name:null,WebBeans Type:MANAGED,API Types:[org.cdi.inject.producer.MySessionBean,java.lang.Object],Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]]
         InjectionType   :  [class org.apache.log4j.Logger]
         Annotated       :  [Annotated Field,Base Type : class org.apache.log4j.Logger,Type Closures : [interface org.apache.log4j.spi.AppenderAttachable, class org.apache.log4j.Logger, class java.lang.Object, class org.apache.log4j.Category],Annotations : [@javax.inject.Inject()],Java Member Name : log]
         Qualifiers      :  [[@javax.enterprise.inject.Default()]]

at org.apache.webbeans.util.InjectionExceptionUtils.throwUnsatisfiedResolutionException(InjectionExceptionUtils.java:92)
... stacktrace truncated

但是,如果我将LogProducer添加到 MyEjb.jar ,则会有效。

1 个答案:

答案 0 :(得分:2)

这是不可能的。 CDI仅扫描应用程序中打包的归档中的生成器注释(以及托管bean类等),而不是共享库中的生成器注释(和托管bean类等)。这类似于已注释的限制类@Stateless@WebServlet必须打包在应用程序中。