JAXB use String as it is

前端 未结 2 1099
难免孤独
难免孤独 2020-12-01 22:40

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 lik

相关标签:
2条回答
  • 2020-12-01 22:46

    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

    • http://blog.bdoughan.com/2011/04/xmlanyelement-and-non-dom-properties.html
    0 讨论(0)
  • 2020-12-01 22:59

    Following bdoughan's answer did not work for me as I encountered errors during marshalling when the text contained the '& character (e.g. in URLs or when using HTML entities such as e.g. " ").

    I was able to resolve this by changing the custom DomHandler's marshal method to

    public Source marshal(String et, ValidationEventHandler veh) {
        Node node = new SimpleTextNode(et);
        return new DOMSource(node);
    }
    

    where SimpleTextNode implements the Node interface as follows:

    class SimpleTextNode implements Node {
        
        String nodeValue = "";
        
        @Override    
        public SimpleTextNode(String nodeValue) {
            this.nodeValue = nodeValue;
        }
        
        @Override
        public short getNodeType() {
            return TEXT_NODE;
        }
    
        // the remaining methods of the Node interface are not needed during marshalling
        // you can just use the code template of your IDE...
    
        ...
    }
    

    PS: I would have loved to leave this as a comment to bdoughan's answer, but unfortunately I have way too little reputation :-(

    0 讨论(0)
提交回复
热议问题