3

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

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

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

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

  1. 正如这里或多或少所描述的,创建一个自定义 ObjectMapper:

    公共类 CustomObjectMapper 扩展 ObjectMapper...

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

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

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

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

<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 注释(据我所知,在这种情况下这还不够)之外,我应该在我的服务器中做什么?

4

2 回答 2

6

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

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

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

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

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

当你说你想将一个 A 类型的对象返回给你的客户端时,你会通过网络以某种方式序列化它——通常是 json 或 xml,但也可能是其他格式——如果你要将它转换为 json,那么你基本上可以自定义ObjectMapper 底层 MappingJacksonHttpMessageConverter(with Jackson 1.x) 或 MappingJackson2HttpMessageConverter(with 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。

于 2012-09-24T21:10:13.760 回答
-2

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

于 2012-09-29T19:54:49.650 回答