2017-09-14 180 views
0

我使用spring-web發送POST xml請求到web服務。但我的XML bean請求不使我jaxb屬性中定義的方式:Spring RestTemplate忽略XML annoations(例如@XmlAttribute)?

//this class is autogenerated with xsdtojava from *.xsd files 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "myRequest") 
public class ServletRequest { 
    @XmlAttribute(name = "age") 
    private int age; 
} 

用法:

ServletRequest req = new ServletRequest(); 
req.setAge(20); 

restTemplateBuilder.build().postForEntity(url, new HttpEntity<>(req), MyRsp.class); 

生成的XML即發:

<ServletRequest> 
    <age>20</age> 
</ServletRequest> 

的問題:兩個@XmlRootElement名稱和@XmlAttribute註釋似乎被忽略。爲什麼?

+0

我有類似的問題,很久以前,我認爲這更多的是傑克遜的設置,然後春天。您可能已經這樣做了,您必須註冊Jackson Jaxb模塊以使用jaxb註釋https://github.com/FasterXML/jackson-module-jaxb-annotations。我實際上最終從'com.fasterxml.jackson.dataformat.xml.annotation'使用'@JacksonXmlProperty(isAttribute = true)'和'@JacksonXmlRootElement(localName =「document」)'' – varren

+0

但是我怎樣才能告訴'xsdtojava'使用'@ JacksonXmlProperty'?我寧願不想修改自動生成的類... – membersound

回答

0
@Bean 
public Jackson2ObjectMapperBuilderCustomizer jackson() { 
    return new Jackson2ObjectMapperBuilderCustomizer() { 
     @Override 
     public void customize(Jackson2ObjectMapperBuilder builder) { 
      builder.modules(new JaxbAnnotationModule()); 
     } 
    }; 
} 

甚至與java8短:

@Bean 
public Jackson2ObjectMapperBuilderCustomizer jackson() { 
    return (builder) -> builder.modules(new JaxbAnnotationModule()); 
} 

傑克遜的2.9.0這是核心傑克遜庫的一部分。

之前,你必須補充:

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