CDI ne fonctionne pas dans l'oreille déployée pour GlassFish v3.0.1
Question
J'ai un problème avec l'utilisation de l'injection de l'enregistreur de soudure.
Scénario:. J'ai l'oreille à l'intérieur ejb-jar
Ceci est mon haricot 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);
}
}
quand print1Partner appelé je suis exception:
| 2010-07-02T19: 25: 35,003 + 0300 | AVERTISSEMENT | oracle-glassfish3.0.1 | javax.enterprise.system.container.ejb.com.sun.ejb.containers | _ThreadID = 48; _ThreadName = thread- 1; | A exception système est survenu au cours d'une appel sur EJB PartnersService Procédé public void ua.co.oasys.fenix.persistence.PartnersService.print1Partner () javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Impossible créer EJB sans état à 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) Causée par: javax.ejb.EJBException: javax.ejb.CreateException: Impossible créer EJB sans état à 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 plus causé par: javax.ejb.CreateException: Impossible créer EJB sans état à 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 plus causé par: 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 plus | #]
Utilisation: ejb 3.1, GlassFish 3.0.1
Certains de dépendance 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>
oreille 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 dans META-INF /
Même configuration de travail avec la guerre dans l'oreille sans ejb (dans la guerre, mais si je l'utilise ejb dans la guerre et la soudure - même exception)
Q1: ce qui est faux
Q2: ce qui est des règles d'utilisation de la soudure et ejb 3.1
La solution 2
Autres conseils
Les artefacts Logger de soudure et SFLF4J sont pas fourni, si vous voulez les utiliser, vous devez les ajouter à votre application:
<!-- 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>
Ensuite
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!");
}
}
J'utilise moi-même-enregistreur de soudure (avec logback comme liant) et testé votre code sous GlassFish 3.0.1, il fonctionne.