我有一个Spring MVC控制器,它使用配置严重的Jackson映射器将POST主体从外部服务转换为Java对象。由于此控制器是可嵌入的组件,因此映射器仅用于此特定数据类型,并且我有HttpMessageConverter
可正确处理转换。
但是,我在将此转换器连接到Web MVC配置时遇到问题,而没有踩踏此控制器所嵌入的主应用程序的配置。我尝试过WebMvcConfigurerAdapter
,但不像addFormatters
,允许我附加自定义格式化程序,configureMessageConverters
中添加的任何转换器都会阻止Spring添加默认转换器集;似乎没有任何类似的XML register-defaults
选项。
加载项组件注册自定义HttpMessageConverter
而不干扰应用程序其余部分的转换服务的最简洁方法是什么?
答案 0 :(得分:0)
这是一个脆弱的解决方案,我会欢迎更强大的替代方案,但我有基本的功能,因此:
List<HttpMessageConverter<?>>
使用的RequestMappingHandlerAdapter
在Spring MVC架构的其他地方被引用,但没有被防御性地复制。获取bean中RequestMappingHandlerAdapter
的引用并手动调用
rhma.getMessageConverters.add(0, myConverter);
有效,但这取决于许多单独组件的内部行为。
答案 1 :(得分:0)
可以为每个servlet配置HttpMessageConverters。如果向web.xml
添加其他调度程序servlet,则可以单独为此servlet配置HttpMessageConverters
。
的web.xml:
...
<servlet>
<servlet-name>custom</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
...
<servlet-mapping>
<servlet-name>custom</servlet-name>
<url-pattern>/custom/*</url-pattern>
</servlet-mapping>
...
定制servlet.xml中:
<beans>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<mvc:default-servlet-handler />
<context:component-scan base-package="package.containing.custom.controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
</beans>