加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java – 如何在Spring RestTemplate中使用JAXB注释?

发布时间:2020-12-15 01:34:40 所属栏目:大数据 来源:网络整理
导读:我正在尝试使用Spring的RestTemplate自动反序列化XML格式的响应.我正在使用Jackson的jackson-dataformat-xml模块,Spring Boot设置为自动配置.我想在我要反序列化的类中使用JAXB注释,但它似乎不起作用.以下是我希望该类看起来像的示例: @XmlRootElement(name

我正在尝试使用Spring的RestTemplate自动反序列化XML格式的响应.我正在使用Jackson的jackson-dataformat-xml模块,Spring Boot设置为自动配置.我想在我要反序列化的类中使用JAXB注释,但它似乎不起作用.以下是我希望该类看起来像的示例:

@XmlRootElement(name="Book")
public class Book {

    @XmlElement(name="Title")
    private String title;
    @XmlElement(name="Author")
    private String author;

}

这基于以下XML示例:


但是,如上所述注释类,字段始终设置为null.我做了一些实验,发现如果我使用Jackson的@JsonProperty注释子元素,反序列化就有效:

@XmlRootElement(name="Book")
public class Book {

    @JsonProperty("Title")
    private String title;
    @JsonProperty("Author")
    private String author;

}

它有效,但不知怎的,我觉得它有点尴尬.有没有办法让JAXB注释像我的第一个例子一样工作?

Jackson提供了jackson-module-jaxb-annotations模块用于XML数据绑定以使用JAXB注释.但是,我不确定如何设置RestTemplate使用的ObjectMapper来使用此模块.

最佳答案
为了解决这个问题,我需要向添加到Spring的RestTemplate的转换器使用的每个ObjectMapper注册一个JaxbAnnotationModule实例.该课程包含在Jackson的jackson-module-jaxb-annotations模块中,我通过Gradle添加到我的构建中.

随着依赖项添加到我的项目中,我接下来要做的是配置我的应用程序使用的RestTemplate. Spring自动配置的MappingJackson2XmlHttpMessageConverters正在使用ObjectMapper实例.我必须将JaxbAnnotationModule实例注册到每个转换器中使用的每个ObjectMapper,因此第一个任务是使用以下命令查找所有MappingJackson2XmlHttpMessageConverters:

//create module
JaxbAnnotationModule jaxbAnnotationModule = new JaxbAnnotationModule();

restTemplate.getMessageConverters().stream().filter(converter -> {
    return converter instanceof MappingJackson2XmlHttpMessageConverter;
})

一旦我拥有了所有相关的转换器,我就将模块注册到它们的每个ObjectMappers:

forEach(converter -> {
    ((MappingJackson2XmlHttpMessageConverter) converter)
            .getObjectMapper()
            .register(jaxbAnnotationModule);
});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读