7

我正在努力将我认为是一项简单的任务放在一起。我有一个无状态单例 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

非常感谢你的帮助

4

1 回答 1

1

你的文字和你的EAR结构有些不一致,即你讲了一个utils.jar但是你的EAR结构图中没有这样的.jar。

尽管如此,您提到您@EJB的包装在里面loader.jar,而它又位于/lib您的 EAR 文件夹中。既然loader.jar是你的ejb-jar,它不应该在 之下/lib,而应该在你的 EAR 的顶层。

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>

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

于 2012-11-01T13:19:50.520 回答