自动检测Jackson for Spring

时间:2015-01-13 21:38:09

标签: java spring spring-mvc jackson

我正在开发一个使用Spring框架和Jackson的项目。但是,我无法找到一个插入的地方。我查看了Web上的许多示例,其中大多数使用类org.springframework.http.converter.json.MappingJacksonHttpMessageConverter的bean来允许@ResponseBody的反序列化。 所以,我找不到MappingJacksonHttpMessageConverter的任何引用。

我的问题:Spring框架会自动使用Jackson,如果它会在类路径中找到它将JSON转换为@ResponseBody对象吗?

启用杰克逊的其他方式有哪些?

1 个答案:

答案 0 :(得分:5)

如果使用@EnableWebMvc或使用标记<mvc:annotation-driven />通过XML连接Spring项目,则启用一系列功能。您可以在original Spring docs中阅读详细的功能列表。

启用的功能之一是支持@RequestBody方法参数和@ResponseBody方法返回值。这是通过HttpMessageConverter组件完成的,并且为使用@RequestMapping@ExceptionHandler注释的方法启用了该功能。

以下列出了默认注册的转换器:

  • ByteArrayHttpMessageConverter转换字节数组。
  • StringHttpMessageConverter转换字符串。
  • ResourceHttpMessageConverter为所有媒体类型转换为org.springframework.core.io.Resource
  • SourceHttpMessageConverter转换为javax.xml.transform.Source
  • FormHttpMessageConverter将表单数据转换为MultiValueMap或从MultiValueMap转换。
  • Jaxb2RootElementHttpMessageConverter将Java对象转换为XML或从XML转换 - 如果类路径中存在JAXB2,则添加。
  • MappingJackson2HttpMessageConverter(或MappingJacksonHttpMessageConverter)转换为/来自JSON - 如果类别路径中存在杰克逊2(或杰克逊),则会添加。
  • AtomFeedHttpMessageConverter转换Atom供稿 - 如果类路径中存在罗马,则添加。
  • RssChannelHttpMessageConverter转换RSS Feed - 如果类路径中存在Rome,则会添加。

因此,如果你在类路径上有一个带有Jackson的 web enabled 项目,Spring将自动转换来自用@ResponseBody注释的控制器方法的返回值(如果是客户端)调用者接受JSON,这意味着通常必须将accept头设置为application/json)。

如果您希望覆盖HttpMessageConverter,可以实施以下内容:

@Configuration
@EnableWebMvc
public class YourConfiguration extends WebMvcConfigurerAdapter {
    @Override
        public void configureMessageConverters(
                List<HttpMessageConverter<?>> converters) {

            // Do your magic, override your stuff
        }
}

有关如何自定义例如的详细介绍您可以阅读杰克逊转换器this article from DZone about Customizing HttpMessageConverters with Spring Boot and Spring MVC