Spring提供了几种通过HttpMessageConverter将POJO转换为XML的方法。但是,我很难找到一个支持带前缀的自定义命名空间的方法。
例如来自
public class Student {
String name;
String address;
Integer score;
}
要
<?xml version="1.0" encoding="UTF-8"?>
<foo:Student xmlns:foo="http://schemas.foo.com/student">
<foo:name>Some Name</foo:name>
<foo:address>Address</foo:address>
<foo:score>95</foo:score>
</foo:Student>
我很高兴使用MappingJackson2HttpMessageConverter和jackson-dataformat-xml,直到我意识到它不支持自定义前缀。
然后我研究了使用MarshallingHttpMessageConverter和XStreamMarshaller,结果发现XStream也不支持自定义前缀。
任何人都可以向我介绍一个如何使用自定义命名空间前缀将POJO序列化为xml的示例吗?感谢。
答案 0 :(得分:3)
我设法解决了杰克逊的类似问题。首先,您必须使用woodstox XML处理器。
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<version>4.4.0</version>
</dependency>
我已经用这种方式添加了命名空间perfix / uri映射:
XmlMapper mapper = new XmlMapper();
// override default instance of WstxOutputFactory
mapper.getFactory().setXMLOutputFactory(new WstxOutputFactory() {
@Override
public XMLStreamWriter createXMLStreamWriter(Writer w) throws XMLStreamException {
mConfig.setProperty(WstxInputProperties.P_RETURN_NULL_FOR_DEFAULT_NAMESPACE, true);
XMLStreamWriter result = super.createXMLStreamWriter(w);
result.setPrefix("xlink", "http://www.w3.org/1999/xlink");
return result;
}
});
当然,这不是优雅的灵魂,但我不确定是否还有其他办法。我希望杰克逊将在未来版本中为前缀添加api支持。
我想在你的情况下需要带前缀的默认命名空间,这似乎更难,因为Jackson不支持默认命名空间(https://github.com/FasterXML/jackson-dataformat-xml/issues/18),甚至使用@JacksonXmlRootElement(namespace="http://xmlns.uri.com")
的类继承你仍然会需要使用@JacksonXmlProperty(namespace="http://xmlns.uri.com")