Spring MVC : 缺省使用的 HttpMessageConverter

HttpMessageConverter 启用条件 介绍
StringHttpMessageConverter 总是启用
ByteArrayHttpMessageConverter 总是启用
ResourceHttpMessageConverter 总是启用
ResourceRegionHttpMessageConverter 总是启用
SourceHttpMessageConverter 总是启用
AllEncompassingFormHttpMessageConverter 总是启用
AtomFeedHttpMessageConverter romePresent
RssChannelHttpMessageConverter romePresent
MappingJackson2XmlHttpMessageConverter jackson2XmlPresent
Jaxb2RootElementHttpMessageConverter jaxb2Present
MappingJackson2HttpMessageConverter jackson2Present
GsonHttpMessageConverter gsonPresent
JsonbHttpMessageConverter jsonbPresent
MappingJackson2SmileHttpMessageConverter jackson2SmilePresent
MappingJackson2CborHttpMessageConverter jackson2CborPresent

以上缺省使用的HttpMessageConverter组件的添加发生在WebMvcConfigurationSupport#addDefaultHttpMessageConverters中 :

	/**
	 * Adds a set of default HttpMessageConverter instances to the given list.
	 * Subclasses can call this method from #configureMessageConverters.
	 * @param messageConverters the list to add the default message converters to
	 */
	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()));
		}
	}

另外,上表中各个HttpMessageConverter的启用条件基于如下代码得到 :

 
// 摘自 WebMvcConfigurationSupport 类
static {
		ClassLoader classLoader = WebMvcConfigurationSupport.class.getClassLoader();
		
		romePresent = ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", classLoader);
		
		jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", classLoader);
		
		jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", 
				classLoader) &&	ClassUtils.isPresent(
				"com.fasterxml.jackson.core.JsonGenerator", 
				classLoader);
		
		jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", 
			classLoader);
		
		jackson2SmilePresent = ClassUtils.isPresent(
			"com.fasterxml.jackson.dataformat.smile.SmileFactory", 
			classLoader);
		
		jackson2CborPresent = ClassUtils.isPresent(
			"com.fasterxml.jackson.dataformat.cbor.CBORFactory", 
			classLoader);
		
		gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
		
		jsonbPresent = ClassUtils.isPresent("javax.json.bind.Jsonb", classLoader);
	}

缺省使用的HttpMessageConverter的引入位置可以参考:

// HttpMessageConverters类代码片段
// HttpMessageConverters#HttpMessageConverters
// ⇒ HttpMessageConverters#getDefaultConverters
	private List<HttpMessageConverter<?>> getDefaultConverters() {
		List<HttpMessageConverter<?>> converters = new ArrayList<>();
		if (ClassUtils.isPresent("org.springframework.web.servlet.config.annotation."
				+ "WebMvcConfigurationSupport", null)) {
			converters.addAll(new WebMvcConfigurationSupport() {

				public List<HttpMessageConverter<?>> defaultMessageConverters() {
					return super.getMessageConverters();
				}

			}.defaultMessageConverters());
		}
		else {
			converters.addAll(new RestTemplate().getMessageConverters());
		}
		reorderXmlConvertersToEnd(converters);
		return converters;
	}

	// WebMvcConfigurationSupport 类代码片段
	/**
	 * Provides access to the shared {@link HttpMessageConverter HttpMessageConverters}
	 * used by the {@link RequestMappingHandlerAdapter} and the
	 * {@link ExceptionHandlerExceptionResolver}.
	 * 

This method cannot be overridden; use {@link #configureMessageConverters} instead. * Also see {@link #addDefaultHttpMessageConverters} for adding default message converters. */ protected final List<HttpMessageConverter<?>> getMessageConverters() { if (this.messageConverters == null) { this.messageConverters = new ArrayList<>(); configureMessageConverters(this.messageConverters); if (this.messageConverters.isEmpty()) { // 这里调用了上面提到的方法 addDefaultHttpMessageConverters addDefaultHttpMessageConverters(this.messageConverters); } extendMessageConverters(this.messageConverters); } return this.messageConverters; }

你可能感兴趣的:(Spring,MVC,分析)