jaxbjaxb2

JAXB use String as it is


I use REST and i was wondering if i can tell jaxb to insert a string field "as-it-is" into the outgoing xml. Certainly i count unpack it before returning, but i would like to save this step.

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

Is there a possability to tell JAXB to just use the String as it is without escapting? I want that the client does not have to parse my response and then parse this field.

greetings, m


Solution

  • You can use the @XmlAnyElement and specify a DomHandler to keep a portion of the XML document as a String.

    Customer

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

    For More Information