【问题标题】:Spring RestTemplate ignores XML annoations (eg @XmlAttribute)?Spring RestTemplate 忽略 XML 注释(例如 @XmlAttribute)?
【发布时间】:2018-02-23 15:54:29
【问题描述】:

我正在使用spring-webPOST xml 请求发送到网络服务。但是我的 Xml bean 请求并没有按照我使用 jaxb 属性定义的方式呈现:

//this class is autogenerated with xsdtojava from *.xsd files
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "myRequest")
public class ServletRequest {
    @XmlAttribute(name = "age")
    private int age;
}

用法:

ServletRequest req = new ServletRequest();
req.setAge(20);

restTemplateBuilder.build().postForEntity(url, new HttpEntity<>(req), MyRsp.class);

发送的结果 xml:

<ServletRequest>
    <age>20</age>
</ServletRequest>

问题:@XmlRootElement 名称和 @XmlAttribute 注释似乎都被忽略了。为什么?

【问题讨论】:

  • 我很久以前就遇到过类似的问题,我认为这更多是关于 Jackson 设置而不是 Spring。您可能已经这样做了,您必须注册 Jackson Jaxb 模块才能使用 jaxb 注释 github.com/FasterXML/jackson-module-jaxb-annotations。我实际上最终使用了来自com.fasterxml.jackson.dataformat.xml.annotation@JacksonXmlProperty(isAttribute = true)@JacksonXmlRootElement(localName = "document")
  • 但是我如何告诉xsdtojava 使用@JacksonXmlProperty?我不想修改自动生成的类...

标签: java spring spring-mvc jaxb jackson


【解决方案1】:
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson() {
    return new Jackson2ObjectMapperBuilderCustomizer() {
        @Override
        public void customize(Jackson2ObjectMapperBuilder builder) {
            builder.modules(new JaxbAnnotationModule());
        }
    };
}

使用 java8 甚至更短:

@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson() {
    return (builder) -> builder.modules(new JaxbAnnotationModule());
}

截至 jackson 2.9.0 这是核心 jackson 库的一部分。

在此之前,您必须添加:

  <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-jaxb-annotations</artifactId>
        <version>2.8.x</version>
    </dependency>

【讨论】:

  • 这个答案似乎只适用于使用 Spring Boot 的情况。提到的 Jackson2ObjectMapperBuilderCustomizer 类在 java 包 org.springframework.boot.autoconfigure.jackson
猜你喜欢
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2012-05-19
  • 2021-06-30
  • 2019-11-29
  • 2011-10-05
  • 2013-11-05
相关资源
最近更新 更多