老版配置

在没有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也在其中。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐