java - 如何将 JAXB 注释与 Spring RestTemplate 一起使用?

标签 java spring spring-mvc spring-boot jaxb

我正在尝试使用 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 示例:

<Book>
    <Title>My Book</Title>
    <Author>Me</Author>
</Book>

但是,对于像上面那样注释的类,字段总是设置为 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 数据绑定(bind)模块与 JAXB 注释一起工作。但是,我不确定如何设置 RestTemplate 使用的 ObjectMapper 来使用这个模块。

最佳答案

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

将依赖项添加到我的项目后,我接下来要做的是配置我的应用程序使用的 RestTemplateObjectMapper 实例由 Spring 自动配置的 MappingJackson2XmlHttpMessageConverter 使用。我必须向每个转换器中使用的每个 ObjectMapper 注册 JaxbAnnotationModule 实例,因此第一个任务是使用以下方法找到所有 MappingJackson2XmlHttpMessageConverter:

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

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

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

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

关于java - 如何将 JAXB 注释与 Spring RestTemplate 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41288036/

相关文章:

java - 无法将数据作为列表从 spring Controller 传递到 View ?

java - 在 gradle mutlimodule 项目中使用 Jacoco 离线检测实现跨模块代码覆盖

java - 不考虑顺序比较两个 List<E>

java - 如何获得最接近的十分之一

java - 如何使用 Hibernate Projection 设置默认的零 SUM 值?

java - 将spring boot mvc部署到远程tomcat 7

spring - ApplicationEventMulticaster 未使用 Spring HATEOAS 初始化

java - 如何添加子选择来选择

用于数据转换的 Java Functions 与 Spring Converter

java - 数据库不显示两个特定实体的关系 - Spring Boot 应用程序