我使用REST,我想知道我是否可以告诉jaxb将字符串字段“as-it-is”插入到传出的xml中。 当然,我会在返回之前将其解包,但我想保存这一步。
@XmlRootElement(name="unnestedResponse")
public class Response{
@Insert annotation here ;-)
private String alreadyXml;
private int otherDate; ...
}
是否有可能告诉JAXB只是使用String而不是转义?我希望客户端不必解析我的响应,然后解析此字段。
问候, 米
答案 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答案的评论,但不幸的是,我的声誉太少了:-(