博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mvc:annotation-driven涉及HttpMessageConverters的源码
阅读量:6830 次
发布时间:2019-06-26

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

对于<mvc:annotation-driven/>,对应的源码解析类为AnnotationDrivenBeanDefinitionParser,其中的parse函数为

@Overridepublic BeanDefinition parse(Element element, ParserContext parserContext) {        ...	ManagedList
messageConverters = getMessageConverters(element, source, parserContext); ... methodExceptionResolver.getPropertyValues().add("messageConverters", messageConverters); ...}复制代码

如果我们在dispatcher-servlet.xml中的配置为

application/xxx;charset=UTF-8
复制代码

在这里就添加的自定义converter就会被getMessageConverters获取到,具体的源码为

private ManagedList
getMessageConverters(Element element, Object source, ParserContext parserContext) { Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters"); ManagedList
messageConverters = new ManagedList(); //获取我们自己定义的Converters if (convertersElement != null) { messageConverters.setSource(source); for (Element beanElement : DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) { Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null); messageConverters.add(object); } } //根据register-defaults的值确定是否获取默认的Converters,默认为true 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) { Class
type = MappingJackson2XmlHttpMessageConverter.class; RootBeanDefinition jacksonConverterDef = createConverterDefinition(type, 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) { Class
type = MappingJackson2HttpMessageConverter.class; RootBeanDefinition jacksonConverterDef = createConverterDefinition(type, source); GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source); jacksonConverterDef.getConstructorArgumentValues().addIndexedArgumentValue(0, jacksonFactoryDef); messageConverters.add(jacksonConverterDef); } else if (gsonPresent) { messageConverters.add(createConverterDefinition(GsonHttpMessageConverter.class, source)); } } return messageConverters; } 复制代码

这里的配置逻辑基本上和老版本的AnnotationMethodHandlerAdapter里的代码一模一样

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

你可能感兴趣的文章
Linux下配置VSftp服务器八步搞定
查看>>
常用MySQL的命令集锦
查看>>
疗伤之设计模式
查看>>
SUN U45 B150 B2500 V240 V440 V880 V890服务器
查看>>
Elasticsearch——多索引的使用
查看>>
sparkJavaApi逐个详解
查看>>
错误:Could not find an available JavaScript runtime
查看>>
在 SQL2005 使用行转列或列转行
查看>>
我的友情链接
查看>>
最让人感触的100句经典爱情歌词
查看>>
WebBrowser控件
查看>>
给个学习机会
查看>>
centos7-mysql-binlog-bump-备份还原
查看>>
linux 内存清理释放命令
查看>>
C#之多态
查看>>
我的友情链接
查看>>
linux 查看磁盘和文件目录
查看>>
docker运行nginx为什么要使用 daemon off
查看>>
Java开发
查看>>
宅男程序员给老婆的计算机课程之12:作业点评
查看>>