2011-01-22 1 views
0

JAX-WS @Pathと@Stateless(または@RequestScoped)アノテーションを使用しているときにLIEを取得しています。コード:JAX-WSとJEE6を使用した場合の恐ろしい初期化例外

org.hibernate.LazyInitializationException:プロキシを初期化できませんでした - 何のセッション

は、ユーザーオブジェクトには、アドレスを持っていない、私は取得しています

@Path("/users") 
@Stateless 
@Produces(MediaType.APPLICATION_XML) 
public class UserResourceRESTService { 
    @Inject 
    @UserRepository 
    @PersistenceContext 
    private EntityManager em; 

    @GET 
    @Path("/{id:[1-9][0-9]*}") 
    public User lookupUserById(@PathParam("id") long id) { 
     return em.find(User.class, id); 
    } 
} 

実際の例外国がある。これをステートフルBeanに変更して拡張コンテキストを使用すると動作しますが、これはSFSBではありませんか?ステートレスBeanを使用しているときに "em"がセッションを開くことができないのはなぜですか?

+1

NullPointerExceptionの後で、これはJava世界で最も一般的な例外です。 googleやstackoverflowで検索した内容はどうでしたか? – Bozho

答えて

0

拡張永続コンテキストで操作している場合、返されたUserエンティティは管理状態のままで、トランザクション永続コンテキストトランザクションを終了するとlookupUserById()メソッドが終了し、そのメソッドの結果はすでに永続性から切り離されたエンティティコンテキスト。結果として、LAZYとしてマークされたそのエンティティのすべてのプロパティは、もはやアクセス可能ではない。

エンティティが永続コンテキストから切り離された後でこれらの遅延プロパティにアクセスする場合は、lookupUserByIdメソッドから戻る前に、そのエンティティで特定のゲッターメソッドを呼び出します。

すなわち

public User lookupUserById(@PathParam("id") long id) { 
    User user = em.find(User.class, id); 
    user.getAddress().getCountry(); 
    return user; 
} 
+0

ありがとう、ありがとう。私はこのメソッドがUserオブジェクトを返すと思います。そして、XMLシリアル化は@Producesタグを介して行われます - したがってLIE。 1つのメソッドからRESTfulな方法でXML/JSONとしてGETリクエストをシリアル化するのはかなり一般的なので、まだ少し驚いています。 – Simon

0

またfetch = FetchType.EAGERとUserクラスにあなたの関係に注釈を付けることができます。あなたはいつもすべてを返すなら、私の意見では怠惰な読み込みをすることは意味がありません。

+0

ありがとう、この場合私は実際に(FetchType.EAGERを使用して)このアプローチを取ってきました。 RESSTfulサービスの一般的な問題のように思えたので、私は本当に興味がありました。 – Simon

+0

確かにそれはバグです、@Producerが生産を終了するまで、セッションがSLSBで開いていてはいけませんか???? – Simon

関連する問題