`

使用 Jackson JSON 处理器和 Apache Wink

阅读更多

简介

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 处理器,用于 Java 对象的 JSON 表示的生成和解析。还可以对 Jackson 进行配置,作为 JAX-RS 实现的一个 JSON 序列化提供程序。

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


表 1. Jackson 的优点

优点 描述 在本地序列化列表的能力 数组处理 速度 许可
Jackson 可以直接从服务中返回一个字符串对象的列表,无需一个封装的 XML 元素。
Jackson 拥有良好的、可预见的数组序列化设施。
具有比其他提供程序更快的速度。
Apache License 2.0 得到了很好的理解。使用该许可的组件被用于商业和免费软件产品。

 

针对 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 文件可能已经在这个目录下。)

加入 My developerWorks 的 Apache Wink 组

My developerWorks Apache Wink 组 中与其他开发人员讨论有关用 Apache Wink 开发 RESTful Web 服务的话题并分享资源。

您还不是 My developerWorks 的一员?现在就加入!

配置 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 服务的示例代码展示了该提供程序的优点。

 

原文:http://www.ibm.com/developerworks/cn/web/wa-aj-jackson/index.html

分享到:
评论

相关推荐

    apache wink rest学习(配置、编码、调用)

    Apache Wink是一个开源的RESTful Web服务开发框架,它提供了构建和消费RESTful服务的一系列工具和库。本文将深入探讨如何配置、编码以及调用Apache Wink服务,结合提供的`web.xml`和`spring`文件,我们来详细了解这...

    Apache Wink User Guide

    2. **注解**:Apache Wink 使用注解来简化资源映射和服务的配置。例如,`@Path` 注解用于指定资源的 URI 路径,`@GET` 和 `@POST` 等注解用于定义 HTTP 方法。 3. **资源匹配**:资源匹配是指根据传入的请求 URL ...

    apache-wink-1.3.0-src.tar.gz

    这个"apache-wink-1.3.0-src.tar.gz"文件是Apache Wink 1.3.0版本的源代码压缩包,提供了完整的源码,供开发者进行深入研究、定制和扩展。以下是关于Apache Wink、RESTful Web服务以及源码压缩包的一些详细知识点: ...

    Apache Wink 和 REST1

    RESTful Web 服务和 Apache Wink

    Apache Wink 和 REST

    RESTful Web 服务和 Apache Wink

    apache-wink-1.2.1-incubating.tar.gz

    这个"apache-wink-1.2.1-incubating.tar.gz"文件是一个归档文件,通常包含完整的Apache Wink框架的所有组件、库和必要的配置文件,方便用户在本地环境中部署和使用。 Apache Wink的核心特性包括: 1. **RESTful ...

    apache-wink-1.2.0-incubating-src.tar.gz

    通过学习和使用Apache Wink,开发者可以构建高效、灵活且可扩展的RESTful服务,同时也可以利用其丰富的客户端支持来创建强大的Web应用程序。由于源代码的开放性,开发者还可以深入研究其内部机制,进一步优化和定制...

    apache wink集成spring 开发rest服务

    集成Spring和Apache Wink的主要目标是利用Spring的IOC容器管理Wink的组件,如资源、过滤器和消息处理器,以及利用Spring的数据访问和事务管理功能。以下是一些关键知识点: 1. **RESTful服务基础**:REST...

    apache-wink-1.4.tar.gz

    3. **JAX-RS兼容**:Apache Wink遵循Java API for RESTful Web Services (JAX-RS)规范,允许开发者使用注解来定义资源和操作,简化了REST服务的开发。 4. **客户端和服务器端支持**:Wink不仅提供了服务器端的实现...

    apache-wink-1.0-incubating.tar.gz

    2. **文档**:用户指南、开发者文档和API参考,帮助用户理解如何使用和扩展Wink。 3. **示例应用**:演示如何使用Wink创建REST服务的示例代码,是学习和调试的好起点。 4. **构建脚本**:如Maven的pom.xml文件,用于...

    apache-wink-1.4-src.tar.gz

    在本文中,我们将深入探讨Apache Wink的核心特性、用途以及如何解压和使用源代码。 **Apache Wink核心特性:** 1. **RESTful服务支持**:Wink提供了一套全面的API和工具来创建、部署和管理RESTful Web服务。它遵循...

    apache-wink-1.1.1-incubating.tar.gz

    Apache Wink的核心目标是简化开发RESTful服务,通过提供一组丰富的库和API,使得开发者可以轻松创建、测试和部署符合REST原则的服务。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发...

    apache-wink-1.1.1-incubating-src.tar.gz

    1. **服务器端组件**:Apache Wink提供了Servlet容器内的运行时环境,支持JAX-RS(Java API for RESTful Web Services)规范,允许开发者使用注解来定义资源类和方法,轻松创建RESTful服务。 2. **客户端库**:Wink...

    apache-wink-0.1-incubating.tar.gz

    6. **模块化设计**:Apache Wink被设计为模块化的,开发者可以根据需要选择安装和使用特定的组件,如HTTP服务器、消息处理器、JSON处理等。 在解压"apache-wink-0.1-incubating.tar.gz"后,你会得到一个名为"apache...

    apache-wink-1.0-incubating-src.tar.gz

    开发者可以使用Wink快速创建基于HTTP的Web服务,同时它还支持JSON和XML数据格式的处理。 在描述中提到的"依赖包",意味着在使用或编译Apache Wink 1.0时,可能需要额外的库或者组件。这可能包括JDK(Java ...

    apache-wink-1.1-incubating.tar.gz

    依赖包是指在使用Apache Wink时,可能还需要额外的库来支持特定功能,例如数据库连接、JSON解析等。确保正确地配置和引入这些依赖,是成功运行Wink应用的关键步骤。 总之,Apache Wink 1.1是一个强大的工具,用于...

    apache-wink-1.2.0-incubating.tar.gz

    "apache-wink-1.2.0-incubating.tar.gz"是该框架的一个发行版本,打包成的tarball文件,方便用户下载和安装。 Wink提供了一系列API和工具,用于简化RESTful服务的开发、测试和部署。这个1.2.0版本可能包含了对之前...

    apache-wink-1.1.2-incubating.tar.gz

    2. **文档**:可能包括用户指南、API文档、开发者指南等,帮助开发者理解如何使用和集成Wink。 3. **库文件**:包含了必要的JAR文件,如核心库、扩展模块等,这些都是运行和部署Wink应用程序所必需的。 4. **示例**...

    apache-wink-1.1-incubating-src.tar.gz

    Apache Wink是一个开源的Java框架,用于构建RESTful Web服务和客户端应用程序。它是在Apache软件基金会的Incubator项目中孵化的,...通过深入理解和使用Apache Wink,开发者可以高效地创建符合REST原则的现代Web应用。

    apache-wink-1.1.2-incubating-src.tar.gz

    标签:apache-wink-1.1.2-incubating-src.tar.gz,apache,wink,1.1.2,incubating,src.tar.gz包下载,依赖包

Global site tag (gtag.js) - Google Analytics