【问题标题】:Spring message convertersSpring消息转换器
【发布时间】:2026-01-08 16:10:02
【问题描述】:

我已经在我们的应用程序中覆盖了 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 注释,再次调用这个 JsonConvertor 因为媒体类型是应用程序 Json .. 当我没有覆盖这个 StringHttpMessageConverter 用于被调用时,因为 StringHttpMessageConverter 比默认的 jsonconvertor 更早 .. 所以我必须通过如下指定来解决问题

<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 中

【问题讨论】:

    标签: json spring message


    【解决方案1】:

    所以我想在 xml 中指定所有的转换器。

    您不应该这样做。有关register-defaults 参数,请参见spring-mvc 中的XSD:

    除了此元素中提供的注册之外,是否应添加默认的 HttpMessageConverter 注册。

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

    您可能需要做的是将自定义转换器的supports() 方法设置为不接受普通的String 对象,以便转换将通过默认的StringHttpMessageConverter

    仍然按要求回答您的问题:

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

    ByteArrayHttpMessageConverterStringHttpMessageConverterResourceHttpMessageConverterSourceHttpMessageConverterAllEncompassingFormHttpMessageConverter。然后,如果相应的库可用:AtomFeedHttpMessageConverterRssChannelHttpMessageConverterMappingJackson2XmlHttpMessageConverterJaxb2RootElementHttpMessageConverterMappingJackson2HttpMessageConverterGsonHttpMessageConverter

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

    【讨论】:

    • @KarunKumar 如果答案解决了您的问题,请接受并投票。