JAXB按原样使用String

时间:2012-10-29 12:45:48

标签: jaxb jaxb2

我使用REST,我想知道我是否可以告诉jaxb将字符串字段“as-it-is”插入到传出的xml中。 当然,我会在返回之前将其解包,但我想保存这一步。

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

是否有可能告诉JAXB只是使用String而不是转义?我希望客户端不必解析我的响应,然后解析此字段。

问候, 米

2 个答案:

答案 0 :(得分:9)

您可以使用@XmlAnyElement并指定DomHandler以将XML文档的一部分保留为String

<强>客户

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

}

了解更多信息

答案 1 :(得分:1)

按照bdoughan的回答对我不起作用,因为在编组期间当文本包含'&字符时(例如,URL中或使用HTML实体,例如“。”)时遇到错误。

我能够通过将自定义DomHandler的{​​{1}}方法更改为

来解决此问题
marshal

其中public Source marshal(String et, ValidationEventHandler veh) { Node node = new SimpleTextNode(et); return new DOMSource(node); } 如下实现Node接口:

SimpleTextNode

PS:我很想把它作为对bdoughan答案的评论,但不幸的是,我的声誉太少了:-(