Spring引导XML更改根元素名称

时间:2017-07-21 06:34:03

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

我编写了一个spring boot应用程序来接受Http get Request并发送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

3 个答案:

答案 0 :(得分:5)

您正在使用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实现这一目标的最简单方法是注册类似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());
}

答案 1 :(得分:2)

您可以在班级使用# This has to go first. If two of the conditions are fulfilled this will never be reached elif (Q("CompanyUrl" in request) & Q("Subject" in request) & Q("Class" in request)): queryset = Product.objects.filter(Q(CompanyUrl=request['CompanyUrl']) | Q(Subject=request['Subject']) | Q(Class=request['Class'])) elif (Q("CompanyUrl" in request) & Q("Subject" in request)): queryset = Product.objects.filter(Q(CompanyUrl=request['CompanyUrl']) | Q(Subject=request['Subject'])) elif (Q("CompanyUrl" in request) & Q("Class" in request)): queryset = Product.objects.filter(Q(CompanyUrl=request['CompanyUrl']) | Q(Class=request['Class'])) elif (Q("Subject" in request) & Q("Class" in request)): queryset = Product.objects.filter(Q(Subject=request['Subject']) | Q(Class=request['Class']))

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

答案 2 :(得分:0)

您是否尝试将类名更改为Response?我认为你的编组人员正在从班上的名字中获得名字。

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

  

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