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
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
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
Albo typ archiwum powinien działać i masz rację, że 'application.xml' jest opcjonalne. Cieszę się, że to pomogło. – rdcrng