我試圖在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