其他分享
首页 > 其他分享> > spring-如何使用名称空间前缀将POJO序列化为xml

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

作者:互联网

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?谢谢.

解决方法:

我设法解决了杰克逊的类似问题.首先,您必须使用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;
    }
  });

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

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

标签:xstream,jaxb2,jackson,spring,spring-mvc
来源: https://codeday.me/bug/20191121/2055238.html