通过@ConversationScoped方法提供EntityManager

时间:2011-10-02 13:05:30

标签: java-ee-6 cdi entitymanager jboss-weld conversation-scope

我试图在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的产品。

3 个答案:

答案 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