繁体   English   中英

Spring 3.1自定义JSON转换器

[英]Spring 3.1 custom JSON converters

我使用的是Spring MVC 3.1,它默认使用Jackson进行JSON-Java转换。

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

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

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

  1. 如上所述这里或多或少,创建自定义ObjectMapper:

    公共类CustomObjectMapper扩展了ObjectMapper ...

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

然后我想我需要在我的自定义objectMapper中有一些特定的实现(它应该如何?)。

  1. 第二种方法谈延长FormattingConversionServiceFactoryBean和创建自己的转换器(实现org.springframework.core.convert.converter.Converter一类)作为描述在这里

更新1:我看到另一种方法是subcalss 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注释之外,我应该在我的服务器上做什么(就我而言,在这种情况下还不够)?

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

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

第二种方法是注册转换器 - 将一个对象转换为另一个对象,例如,将String请求参数从UI转换为对象,或者说如果获得字段的实体ID并希望将其转换为实体。

所以两者都有自己的位置,定制杰克逊你将使用第一种方法,创建自定义转换器,你将使用第二种方法。

更新:根据您提供的新信息,我认为您正在寻找的实际上是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。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM