【问题标题】:Spring boot XML change root element nameSpring Boot XML 更改根元素名称
【发布时间】:2017-12-27 02:07:43
【问题描述】:

我编写了一个 Spring Boot 应用程序来接受一个 Http 获取请求并发送一个 XML 响应作为输出。我需要通过 HTTP 获取以下 XML 作为输出

<response xmlns="">
    <userId>235</userId>
    <amount>345.0</amount>
</response>

我的 DTO 课程如下,

@XmlRootElement(name = "response")
public class CgPayment {
    @XmlElement
    private String userId;
    @XmlElement
    private double amount;

    @XmlElement
    public String getUserId() {
        return userId;
    }

    @XmlElement
    public void setUserId(String userId) {
        this.userId = userId;
    }

    @XmlElement
    public void setAmount(double amount) {
        this.amount = amount;
    }

    @XmlElement
    public double getAmount() {

        return amount;
    }
}

但我得到以下响应作为输出。

<CgPayment xmlns="">
    <userId>235</userId>
    <amount>345.0</amount>
</CgPayment>

如何更改根元素。响应类型为 APPLICATION_XML_VALUE

【问题讨论】:

标签: java xml spring spring-boot jackson-dataformat-xml


【解决方案1】:

【讨论】:

    【解决方案2】:

    您正在使用 JAXB 特定的注释,但 Jackson 来整理您的响应。要使 JAXB 注释与 Jackson 一起使用,您必须在 pom.xml 中包含 jackson-module-jaxb-annotations

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

    此外,您必须为您的配置注册JaxbAnnotationModule。我认为使用 Spring Boot 实现这一目标的最简单方法是注册一个 org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer 类型的 Bean,如下所示:

    @Component
    public class JacksonCustomizer implements Jackson2ObjectMapperBuilderCustomizer {
        @Override
        public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
            jacksonObjectMapperBuilder.modulesToInstall(new JaxbAnnotationModule());
    }
    

    @Bean
    Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
        return (mapperBuilder) -> mapperBuilder.modulesToInstall(new JaxbAnnotationModule());
    }
    

    【讨论】:

    • 这应该是公认的答案。 spring默认使用jackson,所以需要安装JaxbAnnotationModule来使用JAXB注解。从2.9.0 开始,也不再需要额外的依赖。
    • 这对我有用,我在 SpringBootApplication 中添加了 Bean 依赖
    【解决方案3】:

    您是否尝试将类名更改为 Response ?我认为您的编组器正在从类名中获取名称。

    我找到了这个(也许会有所帮助)

    如果 type() 是 JAXBElement.class ,则 namespace() 和 name() 指向一个 带有 XmlElementDecl 的工厂方法。 XML 元素名称是 工厂方法的 XmlElementDecl 注释中的元素名称,或者如果 来自其替换组的元素(其中它是头元素) 已在 XML 文档中替换,则元素名称为 来自替换元素上的 XmlElementDecl。如果 type() 不是 JAXBElement.class,那么 XML 元素名就是 XML 元素名 使用注解与类型静态关联 类型上的 XmlRootElement。如果类型没有用 XmlElementDecl,那么它就是一个错误。如果 type() 不是 JAXBElement.class,那么这个值必须是""。

    【讨论】:

    • 我需要的是作为根节点名称的响应(起始字母很简单)。我已经改变了我的问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多