JAXB 注释不适用于杰克逊消息转换器



我有一个Spring Web项目,我更新了几个jar,classpath同时有JAXB和Jackson XML数据格式jar。我正在尝试使用杰克逊 XML 消息转换器从我的控制器获取预期的 XML 输出,但 JAXB 注释不起作用。有人可以帮忙吗?

包装信息.java

@XmlSchema(xmlns = { 
    @XmlNs(prefix = "ac", namespaceURI = "http://www.example.com/ABC") 
    })
package com.example;

用户人口统计.java

@XmlRootElement(name = "user-demographics", namespace = "http://www.example.com/ABC")
@XmlAccessorType(XmlAccessType.FIELD)
public class UserDemographics {
    @XmlElement(name = "demographic", namespace = "http://www.example.com/ABC")
    private Set<Demographic> demographics = new TreeSet<>();
    @XmlAttribute(name="user-id")
    private int userId;
    static class Demographic{
        private String key;
        private String value;
        @XmlAttribute(name = "name")
        public String getKey() { return key; }
        @XmlValue
        public String getValue() { return value; }
    }
}

预期输出在我显式设置时有效Jaxb2RootElementHttpMessageConverter

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ac:user-demographics xmlns:ac="http://www.example.com/ABC" user-id="2">
    <ac:demographic name="ADDRESS">Mall Road</ac:demographic>
    <ac:demographic name="COUNTRY">India</ac:demographic>
</ac:user-demographics>

不正确,使用默认消息转换器(使用 MappingJackson2XmlHttpMessageConverter (

<UserDemographics xmlns="">
    <demographic>
        <demographic><name>ADDRESS</name><value>Mall Road</value></demographic>
        <demographic><name>COUNTRY</name><value>India</value></demographic>
    </demographic>
</UserDemographics>

当我尝试使用以下代码设置AnnotationIntrospector

@Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    ObjectMapper xmlMapper = Jackson2ObjectMapperBuilder.xml().build();
    xmlMapper.setAnnotationIntrospector(
            AnnotationIntrospector.pair(
                    new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()), 
                    new JacksonAnnotationIntrospector()));
    converters.add(new MappingJackson2XmlHttpMessageConverter(xmlMapper));
  }

我收到以下不正确的响应

<user-demographics xmlns="" xmlns="http://www.example.com/ABC" user-id="2">
    <demographic xmlns:zdef2091338567="" zdef2091338567:name="ADDRESS">Mall Road</demographic>
    <demographic xmlns:zdef112980045="" zdef112980045:name="COUNTRY">India</demographic>
</user-demographics>

如我所见,您有两个问题,一个是缺少不支持的包级前缀,另一个是不正确的前缀,可以通过使用 xml 映射器的不同底层 stax 库实现来解决。

我没有看到最新版本 2.8.7 xml 数据绑定库的第二个问题,它默认为 woodstox stax 库。

您始终可以将 xml 数据绑定库从类路径中删除为默认为 Jaxb2RootElementHttpMessageConverter(如果这是您的选项(。

某些批注尚不受支持。

最新更新