我正在努力将我认为是一项简单的任务放在一起。我有一个无状态单例 Bean,我将把它用作我的应用程序的“加载器”。bean 包含在一个 Jar (loader.jar) 文件中,并位于我的 EAR 的 lib 文件夹中。
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 文件夹中。
现在,在我之前提到的无状态 Singleton 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结构如下:
EAR
|
+---lib
| +--loader.jar
| +--utils.jar
| +--log4j.xx.jar
|
+--MyStatelessSessionBean.jar
非常感谢你的帮助