2012-10-29 12 views
5

私はRESTを使用していますが、jaxbに文字列フィールドを "そのまま"そのままのxmlに挿入するように指示することができますか? 確かに私は戻ってくる前にそれを解凍しますが、私はこのステップを保存したいと思います。JAXBがそのまま文字列を使用

@XmlRootElement(name="unnestedResponse") 
public class Response{ 
@Insert annotation here ;-) 
private String alreadyXml; 
private int otherDate; ... 
} 

JAXBに、エスケープしないでそのまま文字列を使用するように指示する可能性はありますか?私はクライアントが私の応答を解析する必要はなく、このフィールドを解析する必要があります。

挨拶、 メートル

+0

[JAXBを使用してXML要素の内部テキストを抽出する](http://stackoverflow.com/questions/5537416/using-jaxb-to-extract-inner-text-of-xml-element) –

答えて

8

あなたはStringとして、XML文書の一部を維持するためにDomHandler@XmlAnyElementを使用して指定することができます。

詳細情報お客様

import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Customer { 

    private String bio; 

    @XmlAnyElement(BioHandler.class) 
    public String getBio() { 
     return bio; 
    } 

    public void setBio(String bio) { 
     this.bio = bio; 
    } 

} 

BioHandler

import java.io.*; 
import javax.xml.bind.ValidationEventHandler; 
import javax.xml.bind.annotation.DomHandler; 
import javax.xml.transform.Source; 
import javax.xml.transform.stream.*; 

public class BioHandler implements DomHandler<String, StreamResult> { 

    private static final String BIO_START_TAG = "<bio>"; 
    private static final String BIO_END_TAG = "</bio>"; 

    private StringWriter xmlWriter = new StringWriter(); 

    public StreamResult createUnmarshaller(ValidationEventHandler errorHandler) { 
     return new StreamResult(xmlWriter); 
    } 

    public String getElement(StreamResult rt) { 
     String xml = rt.getWriter().toString(); 
     int beginIndex = xml.indexOf(BIO_START_TAG) + BIO_START_TAG.length(); 
     int endIndex = xml.indexOf(BIO_END_TAG); 
     return xml.substring(beginIndex, endIndex); 
    } 

    public Source marshal(String n, ValidationEventHandler errorHandler) { 
     try { 
      String xml = BIO_START_TAG + n.trim() + BIO_END_TAG; 
      StringReader xmlReader = new StringReader(xml); 
      return new StreamSource(xmlReader); 
     } catch(Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

} 

+0

この例ではStringを渡すのではなく、org.w3c.dom.Elementインターフェイスの実装を渡す必要があるため、これをマーシャリングおよび標準JAXBの使用に使用する場合は、重要な注意点の1つです。それ以外の場合、JAXBはマーシャリングにDOMHandlerを使用しません。実装は実際に何か便利なことをする必要はないので、Stringをその中に格納し、マーシャルメソッドでそれを取得し、上の例に従うことができますが、それは他のメソッドのインスタンスでなければなりません。要素を実装するオブジェクト –

+0

@Gabriel - これは標準のJAXBです。 JAXBリファレンス実装にバグが存在する可能性があります。 –

関連する問題