我正在努力将我认为是一项简单的任务放在一起.我有一个无状态单例Bean,我将用作我的应用程序的"加载器".bean包含在Jar(loader.jar)文件中,并驻留在我的EAR的lib文件夹中.
在EAR的根目录中有另一个jar,它包含我的应用程序将使用的无状态会话Bean的实现.
然后我创建了一个小的logger类,它实际上包含了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());
}
}
Run Code Online (Sandbox Code Playgroud)
然后我把它放在一个罐子里,我把它命名为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");
}
}
Run Code Online (Sandbox Code Playgroud)
当我在glassfish 3.1.2上部署我的应用程序时,我在我的Loader bean中第一次调用logger时获得了一个简单的NPE.这让我觉得CDI调用根本没有发生,但我真诚地了解我做错了什么.
到目前为止,我的EAR结构如下:
EAR
|
+---lib
| +--loader.jar
| +--utils.jar
| +--log4j.xx.jar
|
+--MyStatelessSessionBean.jar
Run Code Online (Sandbox Code Playgroud)
非常感谢你的帮助
您的文本和您的 EAR 结构之间存在一些不一致,即您谈论了 autils.jar但您的 EAR 结构图中没有这样的 .jar。
尽管如此,您提到您的文件已@EJB打包在您的 EAR 文件夹中。由于是您的,因此它不应该位于 EAR 之下,而应该位于您的 EAR 的顶层。loader.jar/libloader.jarejb-jar/lib
在里面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>
Run Code Online (Sandbox Code Playgroud)
希望这能解决您的问题。