0

コードはこちら: http://github.com/knownasilya/Ambience

私は永続性をテストしており、管理者クラスでは、アノテーションindex.xhtmlを使用して EntityManager をインスタンス化しています。@PersistenceContextこの例を実行するたびに、 で NPE が得られem.persist(another);ます。

persistence.xmlEclipse のローカル db 構成と同じ接続情報を使用してセットアップを行いました。エラーがどこにあるかを調べるにはどうすればよいですか?

編集ここに関連ファイルがあります。

Index.xhtml https://github.com/knownasilya/Ambience/blob/master/g5.ambience/WebContent/index.xhtml

Admin.java https://github.com/knownasilya/Ambience/blob/master/g5.ambience/src/g5/ambience/user/admin/model/Admin.java

persistence.xml https://github.com/knownasilya/Ambience/blob/master/g5.ambience/src/META-INF/persistence.xml

EDIT2 UserDAO を作成しましたが、特に 24 行目で EntityManager を作成しようとすると、まだ NPE が発生します

EntityManager em = emf.createEntityManager();

このエラーでCaused by: java.lang.NullPointerException at g5.ambience.user.UserDAO.<init>(UserDAO.java:24)

UserDAO.java https://github.com/knownasilya/Ambience/blob/master/g5.ambience/src/g5/ambience/user/UserDAO.java

EDIT3抽象化/カプセル化の 3 つのレイヤーができました。モデル (永続化のためのゲッター/セッター)、ビジネス ロジック、およびビュー ロジック。

ここにエンティティ ファクトリがあります: http://bit.ly/HV4d11で、これはアプリケーション スコープのマネージド Bean です。次に、ManagedUserBean http://bit.ly/In19rXを使用します。これは、UserView http://bit.ly/In1ta6 (セッション スコープ)getUserByUsernameを介してメソッドを呼び出すと、まだ NPE を提供します。それでもうまくいきません。エラーは EntityManager の作成にあります。これが私の stackTrace です: http://pastie.org/3814236

4

2 に答える 2

1

UserDAO は、@PersistenceContext アノテーションを使用するために @Stateless などの EJB Bean である必要があります。良いデザインパターンは2層にすること

  • バッキング Bean - UI のマネージド Bean。XHTML で使用します。
  • サービス層、または DAO と呼ばれる - 基本的なビジネス ロジックを実装するステートレス Bean

ビジネス ロジックとは何か、UI 関連のロジックとは何かを決定します。

JEE6 CDI ソリューションを使用する場合、faces-config.xml でマネージド Bean を宣言する必要はありません。

于 2012-04-18T12:50:17.850 に答える
1

問題は、「アクティブ レコード」パターンと「DAO」パターンを混同していることです。

Java で「アクティブ レコード」パターンを使用する場合、最適なオプションは、Spring Rooまたは Play フレームワーク (< 2.0) を使用することです。

それ以外の場合は、従来の DAO + サービス パターンに従うことをお勧めします (Roo 1.2.1 は現在このパターンをサポートしていると思います)。

編集: この質問に戻った後、Spring Roo を使用することを真剣にお勧めします。これは、Roo が両方をサポートするようになったため、さまざまな設計パターンがどのように機能するかを確認できるようにするためです。また、エンティティマネージャを他の多くのものの中で正しくセットアップします。長期的には Roo を使用する必要はありません。正しい方法を学ぶために、スキャフォールディング コードを確認するだけです。

于 2012-04-18T13:19:00.780 に答える