2

我编写了一个 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

4

3 回答 3

11

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

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

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

@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());
}
于 2017-07-21T07:11:11.013 回答
5

您可以@JacksonXmlRootElement(localName = "response")在班级级别使用。

Javadoc:http ://static.javadoc.io/com.fasterxml.jackson.dataformat/jackson-dataformat-xml/2.2.0/com/fasterxml/jackson/dataformat/xml/annotation/JacksonXmlRootElement.html

于 2017-07-21T07:25:37.843 回答
0

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

我发现了这个(也许会有所帮助)

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

于 2017-07-21T06:51:40.683 回答