0

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 の製品であるため、ここでは問題ではないようです。

4

3 に答える 3

1

そのはず..

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

各会話で同じエンティティ コンテキストを使用する場合は、次のようにする必要があります。

@PersistenceContex(type = PersistenceContextType.EXTENDED)

最後に、サービスレイヤーが必要な場合は、ステートフルを作成して会話 Bean に注入する必要があります

于 2011-10-04T04:22:15.367 に答える
1

覚えておいてください:EntityManagerはシリアライズ可能ではないため、格納できません。ConversationScope

于 2012-08-23T14:17:50.067 に答える
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 に答える