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

时间:2014-04-05 19:05:50

标签: spring spring-mvc jackson xstream jaxb2

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的示例吗?感谢。

1 个答案:

答案 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")

注释每个属性