使用CDI将记录器注入Ejb

时间:2012-10-31 17:58:49

标签: java-ee ejb cdi

我正在努力将我认为是一项简单的任务放在一起。 我有一个无状态单例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驻留在我的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中第一次调用logger时获得了一个简单的NPE。这让我觉得CDI的调用根本没有发生,但我真诚地了解我做错了什么。

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



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

非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

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

尽管如此,您提到您的@EJB已打包在loader.jar内,而/lib又位于您的EAR的loader.jar文件夹中。由于ejb-jar/lib,因此它不应位于application.xml之下,但应位于您的EAR的顶层。

<?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>

{{1}}

希望这可以解决您的问题。