【问题标题】:Spring 3.1 custom JSON convertersSpring 3.1 自定义 JSON 转换器
【发布时间】:2012-09-16 07:03:32
【问题描述】:

我使用 Spring MVC 3.1,默认情况下使用 Jackson 进行 JSON-Java 转换。

我需要为以下内容创建自定义转换:

  1. java.util.List(适用于各种不同的类型)。
  2. 枚举到字符串
  3. java.util.Calendar

我遇到了几种创建自定义转换器的不同方法:

  1. here 所述,或多或少地创建一个自定义ObjectMapper:

    公共类 CustomObjectMapper 扩展 ObjectMapper...

然后将 MappingJacksonHttpMessageConverter 添加到我的 servlet-context 并使用我的自定义 ObjectMapper 注册它:

然后我想我需要在我的自定义 objectMapper 中有一些特定的实现(它应该是什么样子?)。

  1. 第二种方法是关于扩展 FormattingConversionServiceFactoryBean 并创建我自己的转换器(实现 org.springframework.core.convert.converter.Converter 的类),如 here 所述。

更新 1: 我见过的另一种方法是子类 MappingJacksonHttpMessageConverter 并覆盖 getJavaType 方法,如here 所述。为此,我必须将我的自定义转换器添加到转换器列表中:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
    <list>
        <bean class="com.yl.app.CustomMappingJacksonHttpMessageConverter">
    </list>
</property>

推荐哪种方法?只有这些吗,有没有更好的方法?

更新 2:

我还是不明白。在实践中,假设我有 A 类和 B 类。

A 类持有 B 的列表:

public class A {

   public List<B> list;

}

我想将 A 类型的对象返回给我的客户。除了添加 @ResponseBody 注释(据我所知,在这种情况下这还不够)之外,我应该在我的服务器中做什么?

【问题讨论】:

    标签: json spring-mvc jackson


    【解决方案1】:

    两种方法都有不同的用途:

    您概述的第一种方法是自定义 Jackson ObjectMapper - 例如,在 json 中以不同格式显示日期或注册自定义序列化程序以稍微不同地处理将类映射到 json。

    第二种方法是注册转换器 - 将一个对象转换为另一个对象,例如,将一个字符串请求参数从 UI 转换为一个对象,或者说您是否获得了一个字段的实体 ID 并想要转换它到一个实体。

    所以两者都有自己的位置,要自定义 Jackson,您将使用第一种方法,要创建自定义转换器,您将使用第二种方法。

    更新: 根据您提供的新信息,我认为您正在寻找的实际上是 HttpMessageConverter 而不是转换器。

    当你说你想将一个 A 类型的对象返回给你的客户端时,你会通过网络以某种方式序列化它——通常是 json 或 xml,但也可能是其他格式——如果你打算将它转换为 json您基本上自定义 ObjectMapper 底层 MappingJacksonHttpMessageConverter(使用 Jackson 1.x)或 MappingJackson2HttpMessageConverter(使用 Jackson2.x),您通常会这样做:

    <mvc:annotation-driven conversion-service="conversionService"> 
       <mvc:message-converters register-defaults="true">
           <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
               <property name="objectMapper">
                   <bean class="org.bk.lmt.web.spring.CustomObjectMapper"/>
               </property>
           </bean>
       </mvc:message-converters>
    </mvc:annotation-driven>
    

    如果您想自定义 Json 表示,请在自定义对象映射器中注册适当的序列化器/反序列化器。

    与 XML 类似,您通常不会编写自己的转换器 (Jaxb2RootElementHttpMessageConverter),而是使用 XmlJavaAdapters 自定义某些元素的序列化方式。

    如果你有一些新的序列化格式(不是 xml、json),那么可以,你可以尝试从头开始编写一个 HttpMessageConverter。

    【讨论】:

    • 好的,这让事情变得更清楚了。子类化 MappingJacksonHttpMessageConverter 怎么样?
    • @YogevLidor 无需继承 IMO,custom ObjectMapper can be injected
    • 谢谢您,更新问题,仍然不明白我应该在实践中做什么。我另外,注入 objectMapper 不会帮助 List 转换,我猜
    • @Biju Kunjummen - 感谢您更新您的答案,我可能会在明天进行调查。
    【解决方案2】:

    在自己尝试之后,不需要列出的方法。 Jackson(按原样)能够很好地处理嵌套集合,无需自定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      相关资源
      最近更新 更多