【发布时间】:2019-08-26 07:35:33
【问题描述】:
我将spring-boot 与spring-web 和jackson 一起使用。
问题:当一个RestTemplate被spring自动初始化时,构造函数接收到一些重复的MessageConverters:
org.springframework.http.converter.ByteArrayHttpMessageConverter@6a1b4854,
org.springframework.http.converter.StringHttpMessageConverter@2d5b549b,
org.springframework.http.converter.StringHttpMessageConverter@6a175162,
org.springframework.http.converter.ResourceHttpMessageConverter@7641c4e7,
org.springframework.http.converter.ResourceRegionHttpMessageConverter@650a0b50,
org.springframework.http.converter.xml.SourceHttpMessageConverter@55e3b64d,
org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@52f71d2,
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@f3c27e9,
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@7d31fb6c,
org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter@701c413,
org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter@48543f11
你看,有 3 个重复:
StringHttpMessageConverter
MappingJackson2HttpMessageConverter
MappingJackson2XmlHttpMessageConverter
由于我自己没有初始化任何消息转换器:为什么应用程序上下文根本包含重复的转换器,然后将其添加到 resttemplate?
特别是:如果某些转换器出现重复(但配置不同),这不会混淆(反)序列化吗?
例如:第一个MappingJackson2HttpMessageConverter 的ObjectMapper 包含的registeredModuleTypes [Jdk8Module, JavaTimeModule, ParamterNamesModule, JsonComponentModule, GeoModule] 比第二个(仅包含:[Jdk8Module, JavaTimeModule])更多。
这有意义吗?
它是通过RestTemplateAutoConfiguration.restTemplateBuilder() 实例化的,所有重复的MessageConverters 都已经存在。
【问题讨论】:
-
你能在构造函数处设置一个断点并发布整个调用堆栈吗?我想看看它是从哪里实例化的。
-
来自
RestTemplateAutoConfiguration.restTemplateBuilder()。所以它只是注入任何在类路径中找到的HttpMessageConverters。问题是为什么会有重复? -
嗯,这就是我所能得到的。
-
添加了关于 Spring 如何选择
HttpMessageConverter的说明。见底部。
标签: java spring spring-boot jackson spring-web