2012-03-06 9 views
1

私は安らかなインターフェースを使ってすべての製品をリストしようとしています。JAX-RS:RestfulコールでXML出力を選択するにはどうすればよいですか?

@XmlRootElement 
    public class Product implements Serializable { 

    //products attributes defined here 

    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="product") 
    private Set<ProductUser> productUsers= new HashSet<ProductUser>(); 
} 

私は製品にfind.Allを呼び出そうとすると、私が私の残りの部分をXMLで製品のユーザーを含めたくないでもProductUsersを取得しようとすると例外

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role, productUsers, no session or session was closed 

を投げています出力。どのようにXMLに含まれるものを選択的に選択するのですか?

私はREST-Easy、JBoss AS7、JPAとHibernateを実装として使用しています。私のEJB 3.1のメソッドは、Restfulサービスとして公開されています。

ありがとうございました!

答えて

3

JAXBとJPAを1つのクラスでミックスすることはお勧めしません。

JPAエンティティには独自の特別なライフサイクルがあります。公開EJBメソッドからJPAエンティティを返すと、ほとんどの場合、デタッチされます。私はあなたのRESTリソースクラスがEJBであると仮定します。 JPAエンティティは、デフォルトでは、トランザクションが開始され、公開EJBメソッドの呼び出しで終了するため、デタッチされます。詳細については、TransactionAttributeのJavaDocを参照してください。 JPAエンティティがデタッチされると、遅延読み込みはもはや機能しません。それがあなたの問題です。

私は、JPAエンティティとJAXBエンティティに対して別々のクラスを用意することをお勧めします。さらに、JPAエンティティをトランザクション・コンテキストから戻すことは絶対に避けてください。したがって、JPAエンティティの分離/マージに対処する必要はありません。すべてのあなたの怠惰なローディングの問題は歴史だろう。これを実現するには、JPAエンティティをトランザクション内で(パブリックEJBメソッド内で)JAXBエンティティに手動で変換し、JAXBエンティティを返す必要があります。

あなたのGETメソッドは、次のようになります。

@GET 
@Produces("application/xml") 
public JaxbProduct get(@PathParam("id") int id) { 
    JpaProduct product = entityManager.find(JpaProduct.class, id); 
    JaxbProduct result = new JaxbProduct(); 
    result.setPropertyX(product.getPropertyX()); 
    return result; 
} 

を手動でJAXBエンティティにあなたのJPAエンティティを変換することで、あなたの出力と何ではないに入ったかについての完全な制御を持っています。

+0

アレックス、この方法は理にかなっています。試してみます。しかし、私のフロントエンドが(バリデータを利用するために)JPAエンティティを使用したい場合、私はフロントエンド用のEJBとRestfulメソッドとして公開するための2つの別個のメソッドを作成することになります。 JPA Entityのどのコレクションがサービスコールで公開されるのかを選択する他のエレガントな方法はありますか? –

+0

Alex、上記のJpaProductをデタッチしてproduct.setProductUsers(null)を呼び出すと、あなたが提案したもの(別のJaxbProductを作成する)と比較して何らかの欠点があると思いますか? –

+0

@Veer「フロントエンド」と言ったらどういう意味ですか?あなたはあなたの建築用スタックをスケッチしてください。 –

関連する問題