CDI не работает в ухе развернут на Glassfish v3.0.1 - PullRequest
2 голосов
/ 02 июля 2010

У меня возникли проблемы с использованием инжектора сварочного регистратора.

Сценарий: У меня есть ухо с ejb-jar внутри.

Это мой боб ejb:

@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 | ПРЕДУПРЕЖДЕНИЕ | оракул-glassfish3.0.1 | javax.enterprise.system.container.ejb.com.sun.ejb.containers | _ThreadID = 48; _ThreadName = резьбовых 1; | системное исключение произошло во время вызов на EJB PartnersService метод public void ua.co.oasys.fenix.persistence.PartnersService.print1Partner () javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: не удалось создать EJB без состояния в com.sun.ejb.containers.StatelessSessionContainer._getContext (StatelessSessionContainer.java:448) в com.sun.ejb.containers.BaseContainer.getContext (BaseContainer.java:2467) в com.sun.ejb.containers.BaseContainer.preInvoke (BaseContainer.java:1860) в com.sun.ejb.containers.BaseContainer.callEJBTimeout (BaseContainer.java:3962) в com.sun.ejb.containers.EJBTimerService.deliverTimeout (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: не удалось создать EJB без состояния в com.sun.ejb.containers.StatelessSessionContainer $ SessionContextFactory.create (StatelessSessionContainer.java:720) в com.sun.ejb.containers.util.pool.NonBlockingPool.getObject (NonBlockingPool.java:200) в com.sun.ejb.containers.StatelessSessionContainer._getContext (StatelessSessionContainer.java:443) ... еще 12 причин: javax.ejb.CreateException: не удалось создать EJB без состояния в com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB (StatelessSessionContainer.java:528) в com.sun.ejb.containers.StatelessSessionContainer.access $ 000 (StatelessSessionContainer.java:90) в com.sun.ejb.containers.StatelessSessionContainer $ SessionContextFactory.create (StatelessSessionContainer.java:718) ... еще 14 причин: java.lang.NullPointerException в java.util.concurrent.ConcurrentHashMap.get (ConcurrentHashMap.java:768) в org.jboss.weld.manager.BeanManagerImpl.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 | #]

Использование: ejb 3.1, glassfish 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>

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

bean.xml в META-INF /

Та же конфигурация работает с войной в ухе без ejb (на войне, но если я использую ejb на войне и сварке - то же исключение)

Q1: что не так?

Q2: каковы правила использования сварки и ejb 3.1?

Ответы [ 2 ]

0 голосов
/ 04 июля 2010
0 голосов
/ 03 июля 2010

Артефакты Weld Logger и 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, он просто работает.

...