我怎样才能严格添加Spring HttpMessageConverter?

时间:2014-11-18 17:52:22

标签: java spring spring-mvc

我有一个Spring MVC控制器,它使用配置严重的Jackson映射器将POST主体从外部服务转换为Java对象。由于此控制器是可嵌入的组件,因此映射器仅用于此特定数据类型,并且我有HttpMessageConverter可正确处理转换。

但是,我在将此转换器连接到Web MVC配置时遇到问题,而没有踩踏此控制器所嵌入的主应用程序的配置。我尝试过WebMvcConfigurerAdapter,但不像addFormatters ,允许我附加自定义格式化程序,configureMessageConverters中添加的任何转换器都会阻止Spring添加默认转换器集;似乎没有任何类似的XML register-defaults选项。

加载项组件注册自定义HttpMessageConverter而不干扰应用程序其余部分的转换服务的最简洁方法是什么?

2 个答案:

答案 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>