我尝试在 JBoss7 中运行由 maven archetype groupId: org.fluttercode.knappsack, artifactID: jee6-sandbox-archetype 生成的简单 JEE6 应用程序。(通过这个turial,对不起,用德语)
但是,当调用欢迎 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 意味着为每个用户请求重新创建bean,对吗?我预计效率不是很高)
官方 JEE6 教程说:“使用会话、应用程序或会话范围的 bean 必须是可序列化的,但使用请求范围的 bean 不必是可序列化的”。但是,这似乎不是问题所在,因为服务器并没有抱怨 bean 不可序列化,而是生产者 bean 的产品。