我很努力地將我認爲是一件簡單的工作放在一起。 我有一個無狀態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
非常感謝您的幫助
謝謝,我已經更新了這個問題。實際上,我將擁有兩個EJB,一個無狀態會話Bean(MyStatelessSessionBean.jar)和我的單例無狀態bean(loader.jar)。我會嘗試嘗試這個設置並儘快發佈回來。非常感謝你的幫助! – fabpicca
究竟是什麼解決了這個問題,是在一個動態Web應用程序中打包我的加載程序(因此將它移到EAR根級別),並將我的utils.jar庫留在EAR/lib文件夾中。實際上,application.xml是可選的,並且爲了簡單起見,我想暫時忽略它。我會嘗試創建一個jar打包的加載器,但是現在我將繼續使用war打包的加載器。感謝您的支持! – fabpicca
任何一種壓縮文件都可以正常工作,並且您認爲'application.xml'是可選的。很高興它幫助。 – rdcrng