2012-10-29 6 views
5

Ich benutze REST und ich frage mich, ob ich jaxb sagen kann, ein String-Feld "wie es ist" in das ausgehende xml einzufügen. Natürlich zähle ich entpacken es vor der Rückkehr, aber ich möchte diesen Schritt speichern.JAXB benutze String wie es ist

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

Gibt es eine Möglichkeit, JAXB zu sagen, den String so zu benutzen, wie er ist, ohne zu entkommen? Ich möchte, dass der Client meine Antwort nicht analysieren muss und dann dieses Feld analysieren.

Grüße, m

+0

mögliches Duplikat von [Verwendung von JAXB zum Extrahieren von innerem Text des XML-Elements] (http://stackoverflow.com/questions/5537416/using-jaxb-to-extract-inner-text-of-xml-element) –

Antwort

8

können Sie die @XmlAnyElement verwenden und eine DomHandler angeben als String einen Teil des XML-Dokuments zu halten.

Kunden

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); 
     } 
    } 

} 

Weitere Informationen

+0

Ein wichtiger Hinweis, wenn Sie dies für Marshalling und die Verwendung von Standard-JAXB verwenden: Anstatt wie in diesem Beispiel einen String zu übergeben, müssen Sie eine Implementierung der Schnittstelle org.w3c.dom.Element übergeben. Andernfalls wird JAXB den DOMHandler nicht zum Marshalling verwenden. Die Implementierung muss nichts wirklich Nützliches tun, also können Sie einen String darin speichern und ihn dann in der Marshal Methode herausholen und dem Beispiel über dem Rest des Weges folgen, aber es muss eine Instanz von sein Objekt, das Element implementiert. –

+0

@Gabriel - Dies ist Standard JAXB. Es ist möglich, dass es einen Fehler in der JAXB-Referenzimplementierung gibt. –