2012-03-15 23 views
2

JAXBでジャージを使用して、自分のレスポンスをXMLに変換します。リクエストボディからXMLを使用するいくつかのメソッドがあります。そのBeanを、呼び出されるメソッドのパラメータとして指定することができます。JAXBは、要求本体のデータをそのBeanに自動的に変換するために使用されます。互換性がない場合は失敗します。JAXBを使用してサービス層のBeanをマーシャリングする

これは私のすべてのケースの大半で役に立ちます。そして、変換を処理するMessageBodyReaderまたはMessageBodyWriterを書く必要はありませんでした。私は、Beanにマッピングされるリクエスト本体を必要とするこの1つのインスタンスを持っていますが、リクエストの本体にある元のXMLも必要です。私はそれをDBに保存する必要があります。

私はHttpContextを介して要求本体に到達しようとしましたが、どのように把握できません - ヘッダー値とURI値が表示されます。私はHTTPServletContextを試してみましたが、同じ結果に終わりました。

リクエストボディを変換する前にそれをキャプチャする方法はありますか?このケースを処理するためにMessageBodyReaderを作成する必要がありますか?私は既に機能しているbeanにコンテンツをマップするためにそれらが使用されたように思われたので、それが解決策であるとは思わなかった。しかし、おそらくMessageBodyReaderでは、リクエスト本体をいくつかの変数に入れて、データをBeanに変換しながらそれを渡すことができます。それでも、必要以上の仕事があるようです。私は何とかリクエストを受けて体に着くことができると思います。

更新: getEntityメソッドを使用して、BodyをContainerRequestオブジェクトから取得しようとしました。

String xmlString = request.getEntity(String.class); 

そして、それは素晴らしいです。リクエストボディはそのプロパティに取り込まれ、後でリソースなどにアクセスするためにリクエストプロパティに追加することができます。問題は、エンティティがストリームなので、ボディがクリアされるためです。だから、豆へのjaxbマッピングが起こるまでに、変換するものは何もなく、私は悪い要求応答を与えられます。

それはうまくいきませんでしたが、誰かがよりうまく動作するようになっている可能性があります。

これは私がやったことですが、このようにする必要はありません。私は基本的にサービスクラスで非整列化されたものをマーシャリングしています。

final StringWriter st = new StringWriter(); 
try 
{ 

    final JAXBContext jaxbContext = JAXBContext.newInstance(full.classpath.and.classname.of.root.bean); 
    final Marshaller marshaller = jaxbContext.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
    marshaller.marshal(unmarshalled object, st); 
} catch (final JAXBException je) 
{ 
    // TODO Auto-generated catch block 
    je.printStackTrace(); 
} 
final String xml = st.toString(); 

だからあなたが見ることができる - 私は基本的にオブジェクト、体がに非整列化されたことを根豆を取り、marhsallingで使用する注釈付きルートBeanの場所を与えて、それをマーシャリング。

すでに整列されていないものをマーシャリングする必要がありますが、それが応答の場合は、途中で再度マーシャリングされる可能性があります。私は非整列化が起こる前に身体のコピーをつかむことができる解決策が欲しいです。しかし、その間には、これはうまくいくはずです。

答えて

0

私はそれを文字列として取得することにより、それを他の方法で回避を行い、その後、例えば、不必要なJAXBの仕事を避けるために、手動でマーシャリングを除いて、私は、同じシナリオに走ったと同様の結論で終わった:

String xmlString = request.getEntity(String.class); 
Reader sReader = new StringReader(xmlString); 
return (T)jaxbCtx.createUnmarshaller().unmarshal(sReader);  
+0

を私は好きこのアプローチは、あなたが言うように、不要なJAXBの作業を避けるためです。それが私のアプローチの問題です。 – Elrond

関連する問題