如何使用Jackson JSON处理器和Apache Wink?

日期: 2010-11-07 作者:Nick Maynard 来源:TechTarget中国 英文

  Apache Wink正在快速成长为JAX-RS 1.0规范的标准实现之一。JSON.org和Jettison是JSON同步的默认提供程序,但是它们自身存在某些问题。例如,它们的数组表示和有限的返回类型使编写JAX-RS服务及其客户Ajax应用程序变得很困难。

  本文概述了一个配置现有的支持Apache Wink的Web应用程序来使用Jackson JSON提供程序的方法。通过使用一个简单的支持Jackson的JAX-RS Web服务的样例代码来了解这种提供程序的优点。

  Apache Wink附带的JSON提供程序

  Apache Wink打包了两个JSON提供程序作为标准版本的一部分:JSON.org和Jettison实施。这两个提供程序都会使Wink服务和AjaxBoth应用程序的集成复杂化。这两个提供程序都不能直接将一个Java列表作为返回类型序列化到JSON,因为JAXB需要一个封装的XML元素。这两者还有一些其他问题,例如:

  JSON.org

  JSON.org提供程序的数组序列化是可预见的,但是这个行为在和Ajax交互时是不可取的。当它显示各种大小不同的数组时,JSON.org会以不同的方式呈现它们:

  2+:“正确的” 数组序列化。例如:object : { array : [“element1”, “element2”] }

  1:折叠数组。例如:object : { array : “element1” }

  0:完全删除数组。例如:object : { }

  很明显,在Javascript中对不同结构的编码限制会导致多余的、不必要的复杂性。

  Jettison

  Jettison对JSON生成使用Badgerfish惯例,这将生成一种结构,这种结构在转换为Javascript对象后很难进行导航。

  Jackson

  Jackson本质上就是一个JSON处理器,用于 ava对象的JSON表示的生成和解析。还可以对Jackson进行配置,作为JAX-RS实现的一个 JSON 序列化提供程序。

  作为一个JAX-RS JSON序列化提供程序,如下所述,Jackson有几个JSON.org和Jettison所没有的优点。

  表 1. Jackson的优点

  针对Jackson配置Apache Wink

  本文中的示例假设:

  您有一个现有的动态Web项目,该项目被配置为使用Apache Wink作为一个JAX-RS提供程序。
Wink servlet org.apache.wink.server.internal.servlet.RestServlet,在web.xml文件中进行配置,使用一个JAX-RS应用程序,如清单 1 所示。

  清单 1. Wink servlet的web.xml片段
    

以下是引用片段:
<servlet>
  <servlet-name>WinkServlet</servlet-name>
  <servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class>
  <init-param>
    <param-name>javax.ws.rs.Application</param-name>
    <param-value>com.ibm.developerworks.winkJackson.WinkApplication</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>WinkServlet</servlet-name>
  <url-pattern>/services/*</url-pattern>
</servlet-mapping>

   
  下载和安装Jackson库

  从Jackson Web网站下载Jackson的最新版本(链接见参考资源)。在编写本文时,Jackson团队还没有提供使用Jackson和Apache Wink所需的所有库的独立下载资源。您会需要JAR文件的ASL或者LGPL版本,如下所示。

  core-(asl/lgpl):Jackson 核心功能

  mapper-(asl/lgpl):POJO <-> JSON序列化

  jax-rs:Wink和Jackson之间的接口

  jax-xc:和JAXB注释的向后兼容性

  JAR文件必须显示在您的 Web 项目的类路径下。实现此目的的最简单的方法就是将它们放置在您的WEB-INF/lib目录。(您的Apache Wink JAR文件可能已经在这个目录下。)

  配置Apache Wink来使用Jackson提供程序进行JSON序列化

  现在,Jackson JSON提供程序作为您的Web应用程序的一部分进行加载,但是Apache Wink还尚未使用它来进行JSON序列化。

  调整Wink servlet的已配置过的应用程序来加载提供应用程序,如清单 2 所示。

  清单 2. WinkApplication.java示例
    

以下是引用片段:
package com.ibm.developerworks.winkJackson;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
// Jackson imports
import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.AnnotationIntrospector;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
public class WinkApplication extends Application {
  /**
   * Get the list of service classes provided by this JAX-RS application
   */
  @Override
  public Set<Class<?>> getClasses() {
    Set<Class<?>> serviceClasses = new HashSet<Class<?>>();
    serviceClasses.add(HelloWorlds.class);
    return serviceClasses;
  }
  
  @Override
  public Set<Object> getSingletons() {
    Set<Object> s = new HashSet<Object>();
    
    // Register the Jackson provider for JSON
    
    // Make (de)serializer use a subset of JAXB and (afterwards) Jackson annotations
    // See http://wiki.fasterxml.com/JacksonJAXBAnnotations for more information
    ObjectMapper mapper = new ObjectMapper();
    AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
    AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
    AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary);
    mapper.getDeserializationConfig().setAnnotationIntrospector(pair);
    mapper.getSerializationConfig().setAnnotationIntrospector(pair);
    
    // Set up the provider
    JacksonJaxbJsonProvider jaxbProvider = new JacksonJaxbJsonProvider();
    jaxbProvider.setMapper(mapper);
    
    s.add(jaxbProvider);
    return s;
  }

  Direct List<?> 序列化

  Jackson使您能够轻松地从其函数返回Java列表,不需要包装器JAXB XML元素。如清单 3 所示。

  清单 3. HelloWorlds.java
    

以下是引用片段:
package com.ibm.developerworks.winkJackson;
import java.util.Arrays;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path(“helloworlds”)
@Produces(MediaType.APPLICATION_JSON)
public class HelloWorlds {
  
  @GET
  public List<String> helloWorlds() {
    return Arrays.asList(new String [] {“Hello Earth!”,  “Hello Mars!” });
  }
 
}
   
  结束语

  Apache Wink作为JAX-RS规范的实现得到了日益广泛的应用。JSON.org、Jettison和JSON等面向JSON同步的默认提供程序存在某些问题。在本文中,您了解了如何配置已有的支持Apache Wink的Web应用程序来使用Jackson JSON提供程序。本文中的例子通过使用一个支持Jackson的简单JAX-RS Web服务的示例代码展示了该提供程序的优点。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • 多应用程序开发:挑战ALM

    许多企业正在软件开发中经历同时开发多个软件的阶段,但怎样为业务应用程序开发制订短期和长期计划,以帮助他们的公司变得更成熟或为扩张累计能量?

  • 享受热部署:java web应用程序

    所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。对于Java应用程序来说,热部署就是在运行时更新Java类文件。

  • 如何保证Web应用程序安全性?

    Web应用程序是当今多数企业应用的前沿阵地。Web应用程序在一个复杂的混合性架构中可以发挥多种不同的功能。

  • 如何利用现有服务构建SOA应用?

    由于全球性网络的发展、异构信息系统的增加以及需求的灵活多变,传统的应用架构正在不断受到挑战。如今人们不再从事这些工作了:构建全新的应用程序……