我编写了一个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
答案 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']))
。
答案 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;。