Maven archetype groupId: org.fluttercode.knappsack 、artifactID: jee6-sandbox-archetype によって生成された単純な JEE6 アプリケーションを JBoss7 で実行しようとしました。(このチュリアルを経験しました、すみません、ドイツ語で)
ただし、ウェルカム 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 の製品であるため、ここでは問題ではないようです。