如何使用命名空间前缀将 POJO 序列化为 xml

ltf*_*hie 5 spring xstream spring-mvc jaxb2 jackson

Spring 提供了几种通过 HttpMessageConverter 将 POJO 转换为 XML 的方法。但是,我很难找到一个支持带前缀的自定义命名空间。

例如从

public class Student {
   String name;
   String address;
   Integer score;
}
Run Code Online (Sandbox Code Playgroud)

<?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>
Run Code Online (Sandbox Code Playgroud)

我很高兴将 MappingJackson2HttpMessageConverter 与 jackson-dataformat-xml 一起使用,直到我意识到它不支持自定义前缀。

然后我研究将 MarshallingHttpMessageConverter 与 XStreamMarshaller 一起使用,结果发现 XStream 也不支持自定义前缀。

任何人都可以参考我如何使用自定义命名空间前缀将 POJO 序列化为 xml 的示例吗?谢谢。

cie*_*awy 4

我已经设法为杰克逊解决了类似的问题。首先您必须使用 woodstox XML 处理器。

<dependency>
  <groupId>org.codehaus.woodstox</groupId>
  <artifactId>woodstox-core-asl</artifactId>
  <version>4.4.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我已经以这种方式添加了命名空间 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;
    }
  });
Run Code Online (Sandbox Code Playgroud)

当然,这不是优雅的灵魂,但我不确定是否还有其他方法。我希望 Jackson 在未来的版本中添加对前缀的 api 支持。

但我想在你的情况下需要带有前缀的默认命名空间,这似乎更困难,因为 Jackson 不支持默认命名空间(https://github.com/FasterXML/jackson-dataformat-xml/issues/18)甚至使用类继承@JacksonXmlRootElement(namespace="http://xmlns.uri.com")仍然需要注释每个属性@JacksonXmlProperty(namespace="http://xmlns.uri.com")

  • 如果我只想在根元素上添加前缀怎么办? (2认同)