7

簡単な作業だと思ったものをまとめるのに少し苦労しています。ステートレスシングルトンBeanがあり、アプリの「ローダー」として使用します。BeanはJar(loader.jar)ファイルに含まれており、私のEARのlibフォルダーにあります。

EARのルートには、アプリケーションで使用されるステートレスセッションBeanの実装を含む別のjarがあります。

次に、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内に配置しました。このjarでは、CDI仕様に従って、META-INFフォルダー内に空のbeans.xmlファイルを作成しました。utils.jarは、私の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");
        }
    }

アプリをglassfish3.1.2にデプロイすると、ローダー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パッケージがあなたのEARloader.jarのフォルダにあると言います。あなたのものな/libので、それは下にあるべきではありませんが、あなたのEARのトップレベルにあるべきです。loader.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>

うまくいけば、これで問題が解決します。

于 2012-11-01T13:19:50.520 に答える