2012-10-29 10 views
5

Io uso REST e mi chiedevo se posso dire a jaxb di inserire un campo stringa "as-it-is" nel xml in uscita. Certamente conto di scompattarlo prima di tornare, ma vorrei salvare questo passaggio.JAXB usa String come è

C'è una possibilità di dire a JAXB di usare semplicemente la String così com'è senza scappare? Voglio che il client non debba analizzare la mia risposta e quindi analizzare questo campo.

saluti, m

+0

possibile duplicato di [Utilizzo di JAXB per estrarre il testo interno dell'elemento XML] (http://stackoverflow.com/questions/5537416/using-jaxb-to-extract-inner-text-of-xml-element) –

risposta

8

È possibile utilizzare la @XmlAnyElement e specificare un DomHandler di mantenere una parte del documento XML come String.

clienti

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

} 

Per ulteriori informazioni

+0

Una nota importante se la si utilizza per il marshalling e l'utilizzo di JAXB standard: anziché passare una stringa come in questo esempio, è necessario passare a un'implementazione dell'interfaccia org.w3c.dom.Element. In caso contrario, JAXB non utilizzerà DOMHandler per il marshalling. L'implementazione non deve effettivamente fare qualcosa di utile, quindi puoi memorizzare una stringa e poi estrarla nel metodo di marshall e seguire l'esempio sopra il resto del percorso, ma deve essere un'istanza di un oggetto che implementa l'elemento. –

+0

@Gabriel - Questo è JAXB standard. È possibile che ci sia un bug nell'implementazione di riferimento JAXB. –