2012-10-29 9 views
5

Używam REST i zastanawiałem się, czy mogę powiedzieć jaxb, aby wstawić pole ciąg "jak to jest" do wychodzącego xml. Oczywiście liczę rozpakować go przed powrotem, ale chciałbym zapisać ten krok.JAXB używa String, ponieważ jest

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

Czy istnieje możliwość powiadomienia JAXB, aby po prostu użył Łańcucha, tak jak jest, bez eskapowania? Chcę, aby klient nie musiał analizować mojej odpowiedzi, a następnie analizować to pole.

pozdrowienia, m

+0

możliwy duplikat [Używanie JAXB do wyodrębniania wewnętrznego tekstu elementu XML] (http://stackoverflow.com/questions/5537416/using-jaxb-to-extract-inner-text-of-xml-element) –

Odpowiedz

8

Można użyć @XmlAnyElement i określ DomHandler zachować fragment dokumentu XML jako String.

klienta

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

} 

Aby uzyskać więcej informacji

+0

Jedna ważna uwaga, jeśli używasz tego do marshaling i używania standardowego JAXB: zamiast przekazywać ciąg jak w tym przykładzie, MUSISZ przekazać implementację interfejsu org.w3c.dom.Element. W przeciwnym razie JAXB nie użyje DOMHandler do marhallingu. Implementacja nie musi faktycznie robić niczego użytecznego, więc możesz przechowywać w nim String, a następnie pobrać go w metodzie marshala i postępować zgodnie z przykładem powyżej reszty drogi, ale musi to być instancja element implementujący obiekt. –

+0

@Gabriel - Jest to standardowy JAXB. Możliwe, że wystąpił błąd w implementacji referencyjnej JAXB. –

Powiązane problemy