我试图在JBoss7中运行由maven archetype groupId:org.fluttercode.knappsack,artifactID:jee6-sandbox-archetype生成的简单JEE6应用程序。 (通过这个turial,对不起,用德语)
但是,在调用welcome 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的产品。
答案 0 :(得分:1)
应该是......
@Stateful
@ConversationScoped
public class ProducerCreator implements Serializable{
@PersistenceConText
private EntityManager entityManager;
....
}
如果你想在每个对话中使用相同的实体上下文,那么它应该是
@PersistenceContex(type = PersistenceContextType.EXTENDED)
最后,如果你想拥有服务层,应该创建有状态并注入会话bean
答案 1 :(得分:1)
我在jboss7上运行演示时遇到同样的问题。
只需删除getEntityManager()中的@ConversationScoped就可以让我让它部署。
即使存在一些缺陷:
javax.servlet.ServletException: javax.faces.component.StateHolderSaver cannot be cast to [Ljava.lang.Object;
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
我不确切知道,如果它是相关的,但我想是的。
答案 2 :(得分:1)
请记住:EntityManager
不可序列化,因此无法存储在ConversationScope