2015-03-02 81 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

相关问题