0

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

4

3 回答 3

1

记住:EntityManager不可序列化,所以不能存储在ConversationScope

于 2012-08-23T14:17:50.067 回答
1

它应该是..

@Stateful
@ConversationScoped
public class ProducerCreator implements Serializable{
    @PersistenceConText
    private EntityManager entityManager;
    ....
}

如果你想在每个对话中使用相同的实体上下文,它应该是

@PersistenceContex(type = PersistenceContextType.EXTENDED)

最后,如果你想有服务层,应该创建有状态并注入会话 bean

于 2011-10-04T04:22:15.367 回答
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)

我不确切知道它是否相关,但我想是的。

于 2012-02-13T18:12:46.763 回答