博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC配置文件详解(六)
阅读量:2350 次
发布时间:2019-05-10

本文共 6275 字,大约阅读时间需要 20 分钟。


前言

我们之前已经讲解过了

这个标签了,但是他下面是可以有子标签的,今天我们就来讲一下他的子标签,我们在配置文件中使用了他的子标签来完成了对json数据的转化。我们先看下配置

application/json
text/html;charset=UTF-8
WriteMapNullValue
QuoteFieldNames
WriteDateUseDateFormat
WriteEnumUsingToString

mvc:message-converters解析

我们直接看parse方法了。

我们截取注册RequestMappingHandlerAdapter的部分

@Override    public BeanDefinition parse(Element element, ParserContext parserContext) {    ManagedList
messageConverters = getMessageConverters(element, source, parserContext); ManagedList
argumentResolvers = getArgumentResolvers(element, parserContext); ManagedList
returnValueHandlers = getReturnValueHandlers(element, parserContext); String asyncTimeout = getAsyncTimeout(element); RuntimeBeanReference asyncExecutor = getAsyncExecutor(element); ManagedList
callableInterceptors = getCallableInterceptors(element, source, parserContext); ManagedList
deferredResultInterceptors = getDeferredResultInterceptors(element, source, parserContext); RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class); handlerAdapterDef.setSource(source); handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); handlerAdapterDef.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager); handlerAdapterDef.getPropertyValues().add("webBindingInitializer", bindingDef); handlerAdapterDef.getPropertyValues().add("messageConverters", messageConverters); addResponseBodyAdvice(handlerAdapterDef); }

其中getMessageConverters(element, source, parserContext);就是得到我们配置的messageConverters,然后使用 handlerAdapterDef.getPropertyValues().add(“messageConverters”, messageConverters);注入到messageConverters属性中。

getMessageConverters

private ManagedList
getMessageConverters(Element element, Object source, ParserContext parserContext) { Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters"); ManagedList
messageConverters = new ManagedList(); if (convertersElement != null) { messageConverters.setSource(source); for (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) { Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null); messageConverters.add(object); } } if (convertersElement == null || Boolean.valueOf(convertersElement.getAttribute("register-defaults"))) { messageConverters.setSource(source); messageConverters.add(createConverterDefinition(ByteArrayHttpMessageConverter.class, source)); RootBeanDefinition stringConverterDef = createConverterDefinition(StringHttpMessageConverter.class, source); stringConverterDef.getPropertyValues().add("writeAcceptCharset", false); messageConverters.add(stringConverterDef); messageConverters.add(createConverterDefinition(ResourceHttpMessageConverter.class, source)); messageConverters.add(createConverterDefinition(SourceHttpMessageConverter.class, source)); messageConverters.add(createConverterDefinition(AllEncompassingFormHttpMessageConverter.class, source)); if (romePresent) { messageConverters.add(createConverterDefinition(AtomFeedHttpMessageConverter.class, source)); messageConverters.add(createConverterDefinition(RssChannelHttpMessageConverter.class, source)); } if (jackson2XmlPresent) { RootBeanDefinition jacksonConverterDef = createConverterDefinition(MappingJackson2XmlHttpMessageConverter.class, source); GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source); jacksonFactoryDef.getPropertyValues().add("createXmlMapper", true); jacksonConverterDef.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef); messageConverters.add(jacksonConverterDef); } else if (jaxb2Present) { messageConverters.add(createConverterDefinition(Jaxb2RootElementHttpMessageConverter.class, source)); } if (jackson2Present) { RootBeanDefinition jacksonConverterDef = createConverterDefinition(MappingJackson2HttpMessageConverter.class, source); GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source); jacksonConverterDef.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef); messageConverters.add(jacksonConverterDef); } else if (gsonPresent) { messageConverters.add(createConverterDefinition(GsonHttpMessageConverter.class, source)); } } return messageConverters; }

1,查看配置文件中是否有\标签,如果有,将其下的bean注入到messageConverters中。

2.如果没有,就使用默认的注册策略。如果有,且标签里的register-defaults属性为true,那么也要在用户自己实现的messageConverters中添加默认策略。

默认策略注册了

ByteArrayHttpMessageConverterStringHttpMessageConverterResourceHttpMessageConverterSourceHttpMessageConverterAllEncompassingFormHttpMessageConverterAtomFeedHttpMessageConverterRssChannelHttpMessageConverter

以及当程序中引入了某些包后自动会注册相应xml,json类型数据的MessageConverter。

举个例子,当添加了Gson包这个处理json数据的包之后,就会默认的添加GsonHttpMessageConverter。相应代码如下:

else if (gsonPresent) {                messageConverters.add(createConverterDefinition(GsonHttpMessageConverter.class, source));            }

所以这也也是为什么当添加了jackson包或者Gson包,我们的SpringMVC可以自动的处理json格式数据,而为什么我们添加fastjson这个处理json数据的包就不行呢,就必须自己注册,因为默认策略里没有他的一席之地。

mvc:message-converters节点允许了用户实现自己的MessageConverter注入到messageConverters中,扩展了SpringMVC的作用。

转载地址:http://fdmvb.baihongyu.com/

你可能感兴趣的文章
Column count doesn't match value count at row 1
查看>>
页面优化——js异步加载
查看>>
CSS3渐变
查看>>
CSS实现居中的7种方法
查看>>
Charles拦截不到请求
查看>>
gitlab/github 多账户下设置 ssh keys
查看>>
Mac版 charles安装与破解
查看>>
keydown、keypress、keyup的使用
查看>>
区块链是否做好了迎接法币的准备?为什么银行如此看好加密货币?
查看>>
加密货币--Cryptocurrency
查看>>
Myeclipse的不足之一,struts 配置 action
查看>>
input /button链接方法
查看>>
CSS,font-family,好看,常用,中文,字体(更新中)
查看>>
Redis---基础知识:数据类型、持久化机制、虚拟内存、高级特性、应用场景
查看>>
Python3---获取延迟、提前的时间、日期---datetime、time
查看>>
Python3+selenium+Chrome---获取表格(tbody)中数据(tr)的详细内容----a & td内容的获取
查看>>
Docker/Podman使用提高----Dockerfile的制作基础及常见的问题
查看>>
Jenkins持续部署---centos7+Docker+Github+Flask项目-------补丁篇
查看>>
C语言基础---指针数组----初始化方式&常量指针数组、指针常量数组
查看>>
C语言基础---数组、指针之间的相同与不同
查看>>