Spring 消息转换器

Spring message converters

我已经在我们的应用程序中覆盖了 JsonConvertor 并以下面的方式配置了转换器

<mvc:annotation-driven >
 <mvc:message-converters register-defaults="true">
    <bean class="com.test.iv.converters.JsonConverter"  />
  </mvc:message-converters>
</mvc:annotation-driven>

但我遇到的问题是一个用例,我们的用例返回字符串(已经使用 gson 转换为 json),方法上带有 @ResponseBody 注释,同样是 Json 转换器被调用,因为媒体类型是应用程序 Json .. 当我没有覆盖这个 StringHttpMessageConverter 时,它被调用因为 StringHttpMessageConverter 早于默认 json 转换器 .. 所以我不得不修复通过如下指定问题

<mvc:annotation-driven >
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
        <bean class="com.test.iv.converters.JsonConverter"  />
    </mvc:message-converters>
</mvc:annotation-driven>

但我只是想知道,这种冲突也可能与其他转换器一起出现,所以我想指定 xml 中的所有转换器。你能帮我处理所有默认顺序的转换器吗,这样我就可以将它们注入我的 xml

So i want to specify all the convertors in xml.

你不应该这样做。 register-defaults参数见spring-mvc中的XSD:

Whether or not default HttpMessageConverter registrations should be added in addition to the ones provided within this element.

您已明确将此设置为 true,这意味着您的转换器正在注册 除了 默认转换器。

您可能需要做的是将自定义转换器的 supports() 方法设置为不接受普通 String 对象,这样转换就会失败到默认值 StringHttpMessageConverter .

无论如何回答你的问题:

在spring 4.1中,默认的消息转换器是:

ByteArrayHttpMessageConverterStringHttpMessageConverterResourceHttpMessageConverterSourceHttpMessageConverterAllEncompassingFormHttpMessageConverter。然后,如果合适的库可用:AtomFeedHttpMessageConverterRssChannelHttpMessageConverterMappingJackson2XmlHttpMessageConverterJaxb2RootElementHttpMessageConverterMappingJackson2HttpMessageConverterGsonHttpMessageConverter.

这发生在 WebMvcConfigurationSupport 中,特别是 addDefaultHttpMessageConverters 方法 (here on github)。