2015-03-02 76 views
2

我在我的一個Spring Boot項目中自動裝配了默認的Jackson XmlMapper。我創建了一個簡單的示例項目來說明這一點。如何在Spring Boot應用程序中自動配置默認的XmlMapper

我在做什麼在這裏大致在此基礎上:

http://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/#howto-write-an-xml-rest-service

http://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/#howto-customize-the-jackson-objectmapper

從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創建的默認值。

+0

也許春天啓動不包含XmlMapper在IoC容器,儘量先注入豆。 – kris14an 2015-03-02 14:33:58

+0

我知道我可以創建自己的XmlMapper,但我想要默認的一個,它實際上是用於將類映射到響應正文中的Xml的,它現在正確地工作,所以必須有一個XmlMapper ? @ kris14an – 2015-03-02 14:47:16

回答

6

春天啓動不公開XmlMapper的,因爲它會與同時使用JSON映射ObjectMapper豆(傑克遜的XmlMapper是傑克遜的ObjectMapper的子類)衝突的豆。

+1

這回答了當然的問題。一個隱含的下一個問題是,「我可以通過其他方式獲取XmlMapper嗎?」,而且我發現您可以自動調用'MappingJackson2XmlHttpMessageConverter'並通過'.getObjectMapper()'獲取'XmlMapper'。 – 2015-03-02 15:57:15

+1

我試圖用最新的Spring-Boot完成同樣的事情,但發現無法Autowire ObjectMapper或MappingJackson2XmlHttpMessageConverter。兩者都導致「沒有合格的bean類型」錯誤。 – robross0606 2015-03-05 18:35:53

7

基於@Andy Wilkinson的回答,我做了一些更多的挖掘並找到了一種方法來獲得我想要的東西。 Spring Boot不會將XmlMapper作爲Bean公開,但它確實公開了它用於的消息轉換器,即MappingJackson2XmlHttpMessageConverter。所以我可以自動連接這個bean並從中獲得ObjectMapper(現在是XmlMapper)。

演示控制器從我現在的問題是這樣的:

@RestController 
public class DemoController { 
    @Autowired 
    private ObjectMapper objectMapper; 
    @Autowired 
    private MappingJackson2XmlHttpMessageConverter xmlConverter; 

    @RequestMapping(value = "/demo", method = RequestMethod.GET) 
    public Demo getDemo() { 
     Demo demo = new Demo(); 
     demo.setStringProperty("Hello world!"); 
     demo.setIntProperty(42); 
     ObjectMapper xmlMapper = xmlConverter.getObjectMapper(); 
     return demo; 
    } 
} 
+1

我試圖用最新的Spring-Boot完成同樣的事情,但發現我無法Autowire ObjectMapper或MappingJackson2XmlHttpMessageConverter。兩者都導致「沒有合格的bean類型」錯誤。 – robross0606 2015-03-05 18:36:21

+0

@ robross0606檢查問題中是否存在pom.xml中的依賴關係。 – 2015-03-05 20:04:25

+0

已經檢查過。我使用Gradle進行依賴關係管理,但已經確認我具有與Maven POM中上面列出的所有相同的依賴關係。 – robross0606 2015-03-05 20:06:17

相關問題