CDI不部署到Glassfish v3.0.1的耳朵工作
题
我在使用焊接记录器注入时有一些问题。
设想: 我的耳朵里有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.container.ejb.com.sun.ejb.containers | _threadId = 48; _threadname = threadName = thread-thead-thead = thread-1; | | | | | | | | | |在EJB PartnersService方法的调用期间,发生了一个系统异常,public void ua.co.oasys.fenix.persistence.persistence.partnersservice.print1partner() EJB at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:448) at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2467) at com.sun.ejb.containers.BaseContainer. preinvoke(basecontainer.java:1860)com.sun.ejb.containers.basecontainer.basecontainer.callejbtimeout(basecontainer.java:3962)com.ejb.containers.ejbtimerservice.ejbtimerservice.deliverivertimertimertimertimertimertimeres.66 。 java.util.concurrent.executors $ runnableDapter.call(executors.java:441)at Java.util.util.concurrent.futuretask $ sync.innerrun(futuretask.java:303)at Java.util.concurrent.futask.futask.run(futeutask.run(futeutustask.fututun) Java:138)at Java.util.concurrent.threadpoolexecutor $ worker.runtask(threadpoolexecutor.java:886)at Java.util.util.concurrent.threadpoolexecutor $ worker.run.run(threadpoolexecutor.java:908)在java:908) (thread.java:619)引起: 。 ejb.createexception:无法在com.sun.ejb.containers.statatelessessessionContainer.createstatelessejb(SteclessessessionContainer.java.java:528)上创建无状态的EJB EJB t com.sun.ejb.containers.statelesssessioncontainer.access $ 000(SteclessessessionContainer.java:90)at Com.sun.ejb.containers.statelesssessionsessioncontainer $ sessigncontextextory.create.create.create.create.create.create.cotcotcontainer.java:718)。 .lang.NullPointerException at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768) at org.jboss.weld.manager.BeanManagerImpl.getBean(BeanManagerImpl.java:1171) at org.jboss.weld.manager.BeanManagerImpl 。 sun.ejb.containers.basecontainer.createejbinstanceandcontext(basecontainer.java:1616)atcom.sun.ejb.containers.statelesssessisioncontainer.createstestestectestestelessejb(STECESSESSENTSESSIONCONTESSIONCONTESSIONCONTESSIONCONTESSIONCONTESSIONCONTESSIONCONTESSIONCONTESSIONCONTESSINTCONTAINER.JAVA.JAVA:469)
使用: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>
bean.xml在meta-inf/
相同的配置与没有EJB的EAR中的战争一起工作(在战争中,但如果我在战争和焊接中使用EJB - 同样的例外)
Q1:怎么了?
Q2:使用WELD&EJB 3.1的规则是什么?
解决方案 2
其他提示
焊接记录仪和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下测试了您的代码,它只是可行的。