2012-10-31 13 views
6

Trochę borykam się, aby złożyć to, co uważałem za proste zadanie. Mam bezstanową Fasolę Singleton, którą zamierzam użyć jako "ładowarkę" do mojej aplikacji. Komponent bean jest zawarty w pliku Jar (loader.jar) i znajduje się w folderze lib mojego pliku EAR.Wstrzykiwanie Logger'a do Ejb przy użyciu CDI

W katalogu głównym EAR znajduje się inny słoik, zawierający implementację bezpaństwowego komponentu Session Bean, który będzie używany przez moją aplikację.

Potem stworzyliśmy małą klasę rejestratora, który rzeczywiście otacza 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()); 
     } 
    } 

Potem umieściliśmy to wewnątrz słoika, że ​​mam nazwany utils.jar. W tym słoiku, zgodnie ze specyfikacjami CDI, utworzyłem w folderze META-INF pusty plik beans.xml. Plik utils.jar znajduje się w folderze lib mojego pliku EAR.

Teraz w bezstanowym Singleton Bean już wspomniałem wcześniej (ładowarka)

ja napisałem tylko to



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

kiedy wdrożyć mojej aplikacji na GlassFish 3.1.2 dostaję zwykły NPE przy pierwszym wywołaniu rejestratora w mojej fasoli Loader. To sprawia, że ​​myślę, że inwokacja CDI w ogóle się nie dzieje, ale szczerze mówiąc, nie rozumiem, co robię źle.

Dotychczas moja struktura EAR jest następująca:



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

dziękuję za waszą pomoc

Odpowiedz

0

Istnieją pewne rozbieżności pomiędzy tekstem i struktury ucha, czyli mówisz o utils.jar ale nie ma takiego .jar na diagramie struktury EAR. Należy jednak wspomnieć, że numer @EJB jest zapakowany wewnątrz loader.jar, który z kolei znajduje się w folderze /lib Twojego pliku EAR. Ponieważ loader.jar to Twój ejb-jar, nie powinien być pod /lib, ale powinien znajdować się na najwyższym poziomie Twojego EAR.

W 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> 

Mam nadzieję, że to rozwiąże problem.

+0

Dzięki, zaktualizowałem to pytanie od razu. Właściwie zamierzam mieć dwa komponenty EJB, bezstanowe komponenty bean sesji (MyStatelessSessionBean.jar) i mój bezstanowy komponent bean (loader.jar). Postaram się wypróbować tę konfigurację i odesłać tutaj jak najszybciej. Bardzo dziękuję za Twoją pomoc! – fabpicca

+0

Co właściwie rozwiązało problem, to było pakowanie mojego programu ładującego w dynamiczną aplikację internetową (w ten sposób przenosząc ją na poziomie root-a EAR) i pozostawiając moją bibliotekę utils.jar w folderze EAR/lib. Właściwie plik application.xml jest opcjonalny i na razie chciałbym go pominąć dla uproszczenia. Spróbuję stworzyć ładowarkę pakowaną w słoik, ale na razie przejdę do pakowanej wojny. Dziękuję za wsparcie! – fabpicca

+0

Albo typ archiwum powinien działać i masz rację, że 'application.xml' jest opcjonalne. Cieszę się, że to pomogło. – rdcrng