2012-10-31 118 views
6

我很努力地將我認爲是一件簡單的工作放在一起。 我有一個無狀態Singleton Bean,我將用它作爲我的應用程序的「加載程序」。 Bean包含在Jar(loader.jar)文件中,並駐留在我的EAR的lib文件夾中。使用CDI將記錄器注入Ejb

在EAR的根中駐留另一個jar,包含將由我的應用程序使用的無狀態會話Bean的實現。

然後我創建了一個小記錄器類,這實際上包裝的log4j:



    import javax.annotation.PostConstruct; 
    import javax.annotation.PreDestroy; 
    import javax.enterprise.context.RequestScoped; 
    import javax.enterprise.inject.Produces; 
    import javax.enterprise.inject.spi.InjectionPoint; 
    import javax.inject.Named; 

    import org.apache.log4j.Logger; 

    public class LoggerFactory { 
     private Logger logger; 

     public LoggerFactory(){ 
      logger = Logger.getLogger(this.getClass().getName()); 
     } 

     @Produces Logger getLogger(InjectionPoint caller){ 
      return Logger.getLogger(caller.getMember().getDeclaringClass().getName()); 
     } 
    } 

然後我放在這個罐內,我已經命名爲utils.jar。在這個jar文件中,遵循CDI規範,我在META-INF文件夾內創建了一個空的beans.xml文件。 utils.jar駐留在我的EAR的lib文件夾中。現在

,在無狀態的單例的bean我已經提到(裝載機)

我寫之前只是這



    import javax.annotation.PostConstruct; 
    import javax.ejb.Singleton; 
    import javax.ejb.Startup; 
    import javax.inject.Inject; 

    import org.apache.log4j.Logger; 

    @Startup 
    @Singleton 
    public class Core { 
     @Inject 
     private Logger logger; 

     @PostConstruct 
     void init(){ 
      logger.info("Core started"); 
     } 
    } 

,當我在GlassFish 3.1.2部署我的應用程序,我收到了在我的Loader bean中首次調用記錄器時的NPE。這讓我覺得CDI的調用根本就沒有發生,但我真誠的大炮明白我做錯了什麼。

到目前爲止,我的耳朵結構如下:



     EAR 
     | 
     +---lib 
     |  +--loader.jar 
     |  +--utils.jar 
     |  +--log4j.xx.jar 
     | 
     +--MyStatelessSessionBean.jar 

非常感謝您的幫助

回答

0

有你的文字和你的耳朵的結構之間存在一些不一致的地方,即你談論一個utils.jar但EAR結構圖中沒有這樣的.jar。

儘管如此,您提到您的@EJB打包在loader.jar之內,而loader.jar依次位於EAR的/lib文件夾中。由於loader.jar是你的ejb-jar它不應該在/lib下,但應該在你的EAR的頂層。

application.xml

<?xml version="1.0" encoding="UTF-8"?> 
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6"> 
    <module> 
     <ejb>loader.jar</ejb> 
    </module> 
    ... 
    <library-directory>lib</library-directory> 
</application> 

希望這可以解決您的問題。

+0

謝謝,我已經更新了這個問題。實際上,我將擁有兩個EJB,一個無狀態會話Bean(MyStatelessSessionBean.jar)和我的單例無狀態bean(loader.jar)。我會嘗試嘗試這個設置並儘快發佈回來。非常感謝你的幫助! – fabpicca

+0

究竟是什麼解決了這個問題,是在一個動態Web應用程序中打包我的加載程序(因此將它移到EAR根級別),並將我的utils.jar庫留在EAR/lib文件夾中。實際上,application.xml是可選的,並且爲了簡單起見,我想暫時忽略它。我會嘗試創建一個jar打包的加載器,但是現在我將繼續使用war打包的加載器。感謝您的支持! – fabpicca

+0

任何一種壓縮文件都可以正常工作,並且您認爲'application.xml'是可選的。很高興它幫助。 – rdcrng