3

以下の要件を満たす小規模な研究用プロトタイプおよび学生プロジェクト用に、JBoss AS7 に基づく Web アプリケーション スタックをセットアップしようとしています。

  1. PrimeFaces コンポーネントと組み合わせて、マネージド Bean に ViewScope (またはMyFaces Orchestra のような (View)AccessScope)などの AJAX 関連のスコープを使用したいと考えています。

  2. JPA ベースの永続性は、OpenSessionInView パターンなどに対処する必要がなく、かなり簡単です。JPA2 で私が抱えている主な問題は、特に AJAX 呼び出しで発生する恐ろしいLazyInitializationExceptionです。会話を手動で制御する必要はありません。

  3. 使用する依存関係をできるだけ少なくしたいので、主に JBoss AS7 に同梱されているものに依存しています。

現在、次の (ほとんどが提供されている) Maven 依存関係を使用してプロジェクトをセットアップしました。

  • CDI
  • 休止状態-2.0-api
  • jboss-ejb-api_3.1_spec
  • jboss-jsf-api_2.1_spec
  • jboss-annotations-api_1.1_spec
  • プライムフェイス3

これは今のところかなりスリムに見えます。欠けているのは、さらなる JSF 固有のスコープのサポートと、JSF ページ内のコレクションを反復処理するときに常に LazyInitializationException を受け取ることです。現在、永続化のためのサービス クラスは次のようになっています。

import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;

@Stateful @RequestScoped
public class TestEntityService implements Serializable {
    @PersistenceContext(type=PersistenceContextType.EXTENDED)
    private EntityManager entityManager;

    // ... some methods working with the entityManager ...
}

そして私の ResourceFactory Bean:

public class ResourceFactory {
    @Produces @PersistenceUnit
    private EntityManagerFactory entityManagerFactory;
}

@Namedの代わりに@Stateful、またはの@SessionScoped代わりにを組み合わせてみましたがうまくいきませんでし@RequestScopedた。しかし、Seam 3 Persistence、Solder & Faces モジュールを追加すると、ほとんどの問題が解決するように見えますが、これによりプロジェクトに大量の新しい依存関係が追加されます (例: seam-security、prettyfaces、drools、joda-time、およびその他の依存関係)。 )。

私の質問は次のとおりです。

  1. LazyInitializationExceptionに関してEJBは役に立ちますか? @Statefulそれとも、アノテーションのためにここですでに EJB を実際に使用していますか? @ManagedBeanこれは jboss-as サンプル アプリケーションから取得しましたが、これらすべての, @Named, @Stateful,アノテーションの違いに完全に混乱してい@LocalBeanます...私が知っているのは、エンティティ マネージャーの寿命を何らかの形でスコープにバインドする必要があるということだけですサービス豆。

  2. この問題を回避する他の簡単な方法を知っている人はいますか? エンティティごとに複数のコレクションがない場合にのみ機能するように見えるため、EAGER フェッチを使用することはオプションではありません...

  3. MyFaces Orchestra の CDI の後継と思われるApache CODIについて読みました。これは Seam Faces のより良い代替手段ですか? 私が見る限り、ViewScope と ViewAccessScope を提供していますが、トランザクション管理に関しては何も提供していません。

この分野でより多くの経験を積んだ誰かがこれに光を当てることができれば素晴らしいことです-ほとんどの場合、互いに互換性がないように見えますが、同様の問題を扱うライブラリが非常に多くあるため、現在少し混乱しています(例を参照)ここで)。ありがとう!

4

2 に答える 2

6

あなたが正しい。これはすべて非常に紛らわしいです。この混乱は、同じ機能を提供するJSF2とCDIに起因します。これらの2つの仕様は、他の仕様がなくても機能する必要があるため、スコープとELの説明に同様の注釈が付けられています。このブログ投稿では、これらの紛らわしい領域と正しい選択を行う方法について詳しく説明しています。簡単に言うと、JSFでCDIを使用する場合は、常にCDIアノテーション、または拡張機能を介してCDIが制御するアノテーションを使用javax.faces.ViewScopedしてください(プロジェクトにSeam FacesまたはCODIがある場合など)。

あなたの質問に答えるために

  1. @Statefulすでにアノテーション付きのEJBを使用しています。EJBは直接の助けにはなりませんが、トランザクションとデータベースを処理するためのより自然なオプションです( pojo CDI BeanでアノテーションをLazyInitializationException使用することはできません)。@PersistenceContext紛らわしい注釈については、すでに回答しました
  2. SeamPersistenceの使用経験は豊富です。このCDI拡張機能は、会話中に存在し、EJBの外部でトランザクションを使用できるようにするマネージドエンティティマネージャーを作成します(Java EEコンテナーがない場合)。このエンティティマネージャを使用すると、レイジーロードの問題が大幅に減少します。異なるスコープのBeanを注入できるCDIマジックのおかげで、DAOを管理するステートレスEJBに注入できます。Seam Facesと組み合わせて使用​​すると、JSF ViewScope for CDIのサポートと、JSFライフサイクルに関連付けられたトランザクションを利用できます。
  3. ネストされた会話のような便利な機能をもたらすと思われるCODIの経験はありません。

結論として、SeamとCODIは現在Apache Delta Spikeでマージプロセス中であることに注意してください。したがって、構築しようとしているソリューションは、方程式にDeltaSpikeを含めるために来月再評価する必要があります。

于 2012-05-31T04:56:22.637 に答える
0

正直なところ、CDIには「万能」というものはありません。Seam3はうまく機能し、MyFaces CODIはうまく機能します、それは本当にあなたが望むものに依存します。あなたの状況では、正直なところ、プロジェクト用に独自のViewScoped拡張機能を作成するか、Seam3またはCODIから必要なパーツを取得するのが最も簡単な方法のようです。

于 2012-05-31T03:29:37.307 に答える