2

溶接ロガー注入の使用に問題があります。

シナリオ: ejb-jar が入った耳があります。

これは私の ejb Bean です。

@Stateless
@LocalBean
public class PartnersService {
    @Inject
    Logger log;

    @PersistenceContext(unitName = "Utopia")
    EntityManager em;

    public PartnersService() {
    }

    public OasysPartnerEntity getPartner(long id){
        return em.find(OasysPartnerEntity.class, id);
    }

    @Schedule( hour = "*", minute = "*", second = "*/15")
    public void print1Partner(){
        System.out.println("This is test");
        log.info("This is partner`s email under id 1 = ");
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void saveTempPartnerTemp(OasysPartnerTempEntity part){
        em.persist(part);
    }

}

print1Partner が呼び出されたときに例外が発生しました:

|2010-07-02T19:25:35.003+0300|警告|oracle-glassfish3.0.1|javax.enterprise.system.container.ejb.com.sun.ejb.containers|_ThreadID=48;_ThreadName=Thread-1;| EJB PartnersService メソッドの呼び出し中にシステム例外が発生しました public void ua.co.oasys.fenix.persistence.PartnersService.print1Partner() javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: ステートレスを作成できませんでしたcom.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:448) の EJB。com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2467) で。 com.sun.ejb.containers.BaseContainer.callEJBTimeout(BaseContainer.java:3962) で preInvoke(BaseContainer.java:1860) com.sun.ejb.containers.EJBTimerService で。deliveryTimeout(EJBTimerService.java:1667) で com.sun.ejb.containers.EJBTimerService.access$100(EJBTimerService.java:98) で com.sun.ejb.containers.EJBTimerService$TaskExpiredWork.run(EJBTimerService.java:2485) でjava.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) で java.util.concurrent.FutureTask.run(FutureTask. java:138) で java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) で java.lang.Thread.run で(Thread.java:619) 原因: javax.ejb.EJBException: javax.ejb.CreateException: com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory でステートレス EJB を作成できませんでした。com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:200) で create(StatelessSessionContainer.java:720) com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:443) で... 12 以上 原因: javax.ejb.CreateException: com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:528) でステートレス EJB を作成できませんでした com.sun.ejb.containers.StatelessSessionContainer.access com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:718) で $000(StatelessSessionContainer.java:90) ... 14 以上 原因: java.util.concurrent.ConcurrentHashMap での java.lang.NullPointerException org.jboss.weld.manager.BeanManagerImpl の .get(ConcurrentHashMap.java:768)。getBean(BeanManagerImpl.java:1171) org.jboss.weld.manager.BeanManagerImpl.getBean(BeanManagerImpl.java:132) org.glassfish.weld.services.JCDIServiceImpl._createJCDIInjectionContext(JCDIServiceImpl.java:145) org.glassfish .weld.services.JCDIServiceImpl.createJCDIInjectionContext(JCDIServiceImpl.java:122) com.sun.ejb.containers.BaseContainer.createEjbInstanceAndContext(BaseContainer.java:1616) com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java) :469) ... 16 件 |#]createJCDIInjectionContext(JCDIServiceImpl.java:122) at com.sun.ejb.containers.BaseContainer.createEjbInstanceAndContext(BaseContainer.java:1616) at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:469) ... 16もっと |#]createJCDIInjectionContext(JCDIServiceImpl.java:122) at com.sun.ejb.containers.BaseContainer.createEjbInstanceAndContext(BaseContainer.java:1616) at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:469) ... 16もっと |#]

使用: ejb 3.1、グラスフィッシュ 3.0.1

Maven の依存関係の一部:

        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.ejb</artifactId>
            <version>3.0</version>
            <scope>provided</scope>
        </dependency>
<!-- SL4J API -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- SLF4J JDK14 Binding  -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>1.6.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- Injectable Weld-Logger -->
        <dependency>
            <groupId>org.jboss.weld</groupId>
            <artifactId>weld-logger</artifactId>
            <version>1.0.0-CR2</version>
            <scope>provided</scope>
        </dependency>
            <!--CDI-->
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <scope>provided</scope>
            <version>1.0-CR4</version>
        </dependency>

耳pom.xml

<dependencies>
....
<!--weld-->
        <!-- SL4J API -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.0</version>
        </dependency>

        <!-- SLF4J JDK14 Binding  -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>1.6.0</version>
        </dependency>

        <!-- Injectable Weld-Logger -->
        <dependency>
            <groupId>org.jboss.weld</groupId>
            <artifactId>weld-logger</artifactId>
            <version>1.0.0-CR2</version>
        </dependency>

        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>

            <version>1.0-CR4</version>
        </dependency>


    </dependencies>
<build>
...
<configuration>
                    <modules>
...
                       <!--weld-->
                        <!-- SL4J API -->
                        <jarModule>
                            <groupId>org.slf4j</groupId>
                            <artifactId>slf4j-api</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>

                        <!-- SLF4J JDK14 Binding  -->
                        <jarModule>
                            <groupId>org.slf4j</groupId>
                            <artifactId>slf4j-jdk14</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>

                        <!-- Injectable Weld-Logger -->
                        <jarModule>
                            <groupId>org.jboss.weld</groupId>
                            <artifactId>weld-logger</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>
                        <jarModule>
                            <groupId>javax.enterprise</groupId>
                            <artifactId>cdi-api</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>

                    </modules>
                </configuration>
            </plugin>

        </plugins>

    </build>

META-INF/ の bean.xml

ejb を使用せずに war in ear で動作する同じ構成 (戦争中ですが、戦争で ejb を使用して溶接する場合 - 同じ例外)

Q1: 何が悪いの?

Q2: 溶接 & ejb 3.1 を使用する際の規則は何ですか?

4

1 に答える 1

0

ウェルドロガーとSFLF4Jアーティファクトは提供されていません。これらを使用する場合は、アプリケーションに追加する必要があります。

<!-- SL4J API -->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.6.0</version>
</dependency>

<!-- SLF4J JDK14 Binding  -->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-jdk14</artifactId>
  <version>1.6.0</version>
</dependency>

<!-- Injectable Weld-Logger -->
<dependency>
  <groupId>org.jboss.weld</groupId>
  <artifactId>weld-logger</artifactId>
  <version>1.0.0-CR2</version>
</dependency>

それで

import javax.inject.Inject;
import org.slf4j.Logger;

public class Foo {
    @Inject
    private Logger logger;

    public void bar() {
        logger.info("Look ma, I'm using an injected Logger!");
    }
}

私は自分でウェルドロガーを使用しており(バインドとしてログバックを使用)、GlassFish 3.0.1でコードをテストしましたが、正常に機能します。

于 2010-07-03T00:33:35.267 に答える