我正在开发一个使用Spring框架和Jackson的项目。但是,我无法找到一个插入的地方。我查看了Web上的许多示例,其中大多数使用类org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
的bean来允许@ResponseBody
的反序列化。
所以,我找不到MappingJacksonHttpMessageConverter
的任何引用。
我的问题:Spring框架会自动使用Jackson,如果它会在类路径中找到它将JSON转换为@ResponseBody
对象吗?
启用杰克逊的其他方式有哪些?
答案 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。