我在我的一個Spring Boot項目中自動裝配了默認的Jackson XmlMapper
。我創建了一個簡單的示例項目來說明這一點。如何在Spring Boot應用程序中自動配置默認的XmlMapper
我在做什麼在這裏大致在此基礎上:
從pom.xml的
<!-- ... -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.2.RELEASE</version>
</parent>
<!-- ... -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
</dependencies>
<!-- ... -->
主類:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
演示POJO,不指定@XmlRootElement
,所以它不會使用JAXB:
@JsonInclude(Include.NON_NULL)
public class Demo {
private String stringProperty;
private int intProperty;
public String getStringProperty() {
return stringProperty;
}
public void setStringProperty(String stringProperty) {
this.stringProperty = stringProperty;
}
public int getIntProperty() {
return intProperty;
}
public void setIntProperty(int intProperty) {
this.intProperty = intProperty;
}
}
演示控制器:
@RestController
public class DemoController {
@Autowired
private ObjectMapper objectMapper;
// @Autowired
// private XmlMapper xmlMapper;
@RequestMapping(value = "/demo", method = RequestMethod.GET)
public Demo getDemo() {
Demo demo = new Demo();
demo.setStringProperty("Hello world!");
demo.setIntProperty(42);
return demo;
}
}
一切正常,事情是這樣的,這取決於Accept
頭,無論是JSON或XML將被返回。
我可以輕鬆自動裝入由Spring Boot配置的默認ObjectMapper
。到現在爲止還挺好。
如果我在XmlMapper
我得到的自動裝配評論:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.fasterxml.jackson.dataformat.xml.XmlMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 18 more
任何想法,這是爲什麼?我會假定它的工作方式與ObjectMapper
相同。只是澄清,我不要想要自定義映射器,我只是想引用由Spring Boot創建的默認值。
也許春天啓動不包含XmlMapper在IoC容器,儘量先注入豆。 – kris14an 2015-03-02 14:33:58
我知道我可以創建自己的XmlMapper,但我想要默認的一個,它實際上是用於將類映射到響應正文中的Xml的,它現在正確地工作,所以必須有一個XmlMapper ? @ kris14an – 2015-03-02 14:47:16