spring boot 中关于MappingJackson2HttpMessageConverter的自动配置
老版配置在没有springboot之前,大多数我们使用的是springmvc的框架,配置MappingJackson2HttpMessageConverter(下文简称MC)需要我们在配置文件中手动配置:<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
老版配置
在没有springboot之前,大多数我们使用的是springmvc的框架,配置MappingJackson2HttpMessageConverter(下文简称MC)需要我们在配置文件中手动配置:
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
p:messageConverters-ref="messageConverters" />
<util:list id="messageConverters">
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</util:list>
升级SpringBoot之后,出现问题
后来app端报错,开发人员反馈是时间类型没有返回时间戳,MC是springboot的默认配置,没有返回时间戳,推测可能配置没有生效。
springboot的自动配置大部分都在spring-boot-configurate包中,在http包下,有HttpMessageConvertersAutoConfiguration配置类,如图所示,改包下除了自动生成了String转换器之外还通过@import属性引入了JacksonHttpMessageConvertersConfiguration.class配置类,
在项目启动的时候打上断点,bean被正常注册。
##以下内容部分来自 Jackson全面解析–SpringBoot集成Jackson一(autoconfigure)
对被@responseBody修饰的方法,在返回方法返回值之前,会通过RequestResponseBodyMethodProcessor类来进行处理。其中的handleReturnValue方法会将方法返回的对象进行Converter成我们需要的类型。
而在生成HttpMessageConverters bean的时候会调用WebMvcConfigurationSupport类的addDefaultHttpMessageConverters方法,在这个里面会继续的注册一些默认使用到的消息转换器。
WebMvcConfigurationSupport
WebMvcConfigurationSupport类是springboot为我们提供的mvc配置主类,使用者可以通过继承的方式并且重写其中的方法,并且在子类上生命@Configuration注解来使配置生效。
我的项目中mvc配置是直接实现的WebMvcConfigurer,这两里面的方法一样,不同的是WebMvcConfigurationSupport里面有很多springboot为我们做的配置,而WebMvcConfigurer里面是空的;
protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
stringHttpMessageConverter.setWriteAcceptCharset(false); // see SPR-7316
messageConverters.add(new ByteArrayHttpMessageConverter());
messageConverters.add(stringHttpMessageConverter);
messageConverters.add(new ResourceHttpMessageConverter());
messageConverters.add(new ResourceRegionHttpMessageConverter());
try {
messageConverters.add(new SourceHttpMessageConverter<>());
}
catch (Throwable ex) {
// Ignore when no TransformerFactory implementation is available...
}
messageConverters.add(new AllEncompassingFormHttpMessageConverter());
if (romePresent) {
messageConverters.add(new AtomFeedHttpMessageConverter());
messageConverters.add(new RssChannelHttpMessageConverter());
}
if (jackson2XmlPresent) {
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
if (this.applicationContext != null) {
builder.applicationContext(this.applicationContext);
}
messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
}
else if (jaxb2Present) {
messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
}
if (jackson2Present) {
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json();
if (this.applicationContext != null) {
builder.applicationContext(this.applicationContext);
}
messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build()));
}
else if (gsonPresent) {
messageConverters.add(new GsonHttpMessageConverter());
}
else if (jsonbPresent) {
messageConverters.add(new JsonbHttpMessageConverter());
}
if (jackson2SmilePresent) {
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.smile();
if (this.applicationContext != null) {
builder.applicationContext(this.applicationContext);
}
messageConverters.add(new MappingJackson2SmileHttpMessageConverter(builder.build()));
}
if (jackson2CborPresent) {
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.cbor();
if (this.applicationContext != null) {
builder.applicationContext(this.applicationContext);
}
messageConverters.add(new MappingJackson2CborHttpMessageConverter(builder.build()));
}
}
主要是这个方法,会在容器中配置一些默认的消息转换器,MC也在其中。
更多推荐
所有评论(0)