在Spring中添加Jaxb2消息转换器会破坏Jackson2 json映射

时间:2013-09-06 05:13:03

标签: java xml json spring

我正在尝试这样做,所以我的Spring rest应用程序可以处理xml和json响应,但似乎添加Jaxb消息转换器已经破坏了我的json映射。

@Bean
public MappingJackson2HttpMessageConverter jsonConverter() {
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    SimpleModule simpleModule = new SimpleModule();
    simpleModule.addSerializer(String.class, new StringSerializer());
    ObjectMapper mapper = new ObjectMapper()
        .registerModule(simpleModule);
    converter.setObjectMapper(mapper);
    return converter;
}

@Bean
public Jaxb2RootElementHttpMessageConverter jaxbConverter() {
    return new Jaxb2RootElementHttpMessageConverter();
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(jsonConverter());
    converters.add(jaxbConverter());
}

如果我在那里注释掉第二种和第三种方法,一切都会重新开始工作(当然除了xml映射!)。但是,在那里,我搞砸了一些东西,比如在List<String>中序列化[APPLEORANGEBANANA]个结果,其中apple,orange和banana是列表中的单独字符串。

如果我直接使用jackson对象映射器映射到json,它没有那个问题,但使用@ResponseBody注释自动序列化为json我有这个问题。

有人有什么想法吗?

4 个答案:

答案 0 :(得分:4)

这就是我做到的。

@RequestMapping(method = RequestMethod.GET, value = "/accounts/{accountId}", produces = {APPLICATION_XML_VALUE, APPLICATION_JSON_VALUE})
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
public Account getAccount(@PathVariable String accountId) {
    return new Account(); // populate Account VO and send
}

并在XML文件中

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" >
    <mvc:message-converters register-defaults="false">
       <ref bean="xmlConverter"/>
       <ref bean="jsonConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven> 

 <!-- XML MessageConverter -->
 <bean id="xmlConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
  <constructor-arg ref="jaxbMarshaller"/>
  <property name="supportedMediaTypes" value="application/xml" />
 </bean> 

<!-- JSON MessageConverter -->
 <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
 </bean>

<!-- JAXB Classes to be marshalled -->
<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="packagesToScan">
   <list>
    <value>com.test.*</value>
    <value>com.*.test</value>
  </list>
  </property>
</bean>

答案 1 :(得分:0)

我删除了configureMessageConverters,它自动获取了两个转换器,但都没有问题。

答案 2 :(得分:0)

对我发生了同样的事情。两次: - )

在一个案例中,添加转换器之前的简单converters.clear()解决了这个问题。看起来Spring默认添加了一些转换器。使用XML注入它们会删除Spring隐式设置的那个,而从代码中明确添加它们则不会。

在另一种情况下,问题是请求中设置了正确的标头,即content-typeaccept。在请求映射中,我必须指定“消耗”和“生成”参数,分别映射两个头。

public class MyRequestHandler {
     ...

     @RequestMapping(... , consumes={ MediaType.APPLICATION_JSON_VALUE, produces = { MediaType.APPLICATION_JSON_VALUE } }
     public ResponseEntity<MyResultClass> doSomething(...) { ... }

     ...
}

这解决了我的问题。

答案 3 :(得分:0)

当您覆盖configureMessageConverters时,它不会添加默认消息转换器。尝试下面的代码。

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(jsonConverter());
    converters.add(jaxbConverter());
    super.addDefaultHttpMessageConverters();
}