我试图在JBoss7中运行由maven archetype groupId生成的简单JEE6应用程序:org.fluttercode.knappsack,artifactID:jee6-sandbox-archetype。 (通过这个turial去了,对不起,德语)通过@ConversationScoped方法提供EntityManager
但是,调用的欢迎JSF的时候,我得到了以下错误消息:
org.jboss.weld.exceptions.IllegalProductException: WELD-000053 Producers
cannot declare passivating scope and return a non-serializable class:
[method] @Produces @DataRepository @ConversationScoped
public org.rap.jee6project.bean.DataRepositoryProducer.getEntityManager()
org.jboss.weld.bean.AbstractProducerBean.checkReturnValue(AbstractProducerBean.java:264)
org.jboss.weld.bean.AbstractProducerBean.create(AbstractProducerBean.java:362)
org.jboss.weld.context.AbstractContext.get(AbstractContext.java:122)
事实上,它应该返回一个EntityManager的DataRepositoyProducer类实例,被定义为如下注释:
@Stateless
public class DataRepositoryProducer {
private EntityManager entityManager;
@Produces @DataRepository @ConversationScoped
public EntityManager getEntityManager() {
return entityManager;
}
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}
如果我使用@RequestScoped,应用程序按照承诺运行。我想知道为什么其他人通过本教程没有遇到这个问题?以及如何正确地修复它(使用@RequestScoped意味着豆为每个用户请求重新创建,对吧?,我预计效率不高)
官方JEE6教程说:“使用会话,应用程序或会话范围必须是可序列化的,但使用请求范围的bean不必是可序列化的“”。然而,这似乎并不是问题,因为服务器不是关于不可序列化的bean,而是生产者bean的产品。
使得DataRepositoryProducer一个状态bean和注释全班同学为@ConversationScoped时,它的工作原理。不知道我是否应该对这个解决方案感到满意。 也许,生产者的概念并不是容器提供的对象(如EntityManager)的最佳实践。 – rainer198