Jakarta ee 使用CDI将记录器注入Ejb

Jakarta ee 使用CDI将记录器注入Ejb,jakarta-ee,ejb,cdi,Jakarta Ee,Ejb,Cdi,我正在努力把我认为是一项简单的任务整合起来。 我有一个无状态的单例Bean,我将使用它作为我的应用程序的“加载器”。 bean包含在一个Jar(loader.Jar)文件中,并驻留在我的EAR的lib文件夹中 EAR的根目录中驻留着另一个jar,其中包含我的应用程序将要使用的无状态会话Bean的实现 然后我创建了一个小的logger类,它实际上包装了log4j: import javax.annotation.PostConstruct; import javax.annot

我正在努力把我认为是一项简单的任务整合起来。 我有一个无状态的单例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());
        }
    }

然后我把它放在一个罐子里,我把它命名为utils.jar。在这个jar中,按照CDI规范,我在META-INF文件夹中创建了一个空的beans.xml文件。 utils.jar位于my 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上部署我的应用程序时,我在加载程序bean中第一次调用logger时就得到了一个普通的NPE。这让我觉得CDI调用根本没有发生,但我真诚地理解我做错了什么

到目前为止,我的耳朵结构如下:



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


非常感谢您的帮助

您的文本与EAR结构之间存在一些不一致之处,即您谈论的是
utils.jar
,但EAR结构图中没有这样的.jar

尽管如此,您提到您的
@EJB
是打包在
loader.jar
中的,而后者又位于EAR的
/lib
文件夹中。由于
loader.jar
是您的
ejb 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>

加载器.jar
...
解放党

希望这能解决您的问题。

谢谢,我已经立即更新了问题。实际上,我将有两个EJB,一个无状态会话bean(mystatelessessionbean.jar)和我的单例无状态bean(loader.jar)。我会试着给这个设置一个尝试,并尽快回到这里。非常感谢你的帮助!真正解决这个问题的是,将我的加载程序打包到一个动态web应用程序中(从而在EAR根级别移动它),并将我的utils.jar库保留在EAR/lib文件夹中。实际上application.xml是可选的,为了简单起见,我暂时不考虑它。我将尝试创建一个jar打包的加载器,但目前我将继续使用war打包的加载器。谢谢你的支持!这两种归档类型都应该可以工作,而且
application.xml
是可选的。不过很高兴这有帮助。