简介
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 文件可能已经在这个目录下。)
配置 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是一个开源的RESTful Web服务开发框架,它提供了构建和消费RESTful服务的一系列工具和库。本文将深入探讨如何配置、编码以及调用Apache Wink服务,结合提供的`web.xml`和`spring`文件,我们来详细了解这...
2. **注解**:Apache Wink 使用注解来简化资源映射和服务的配置。例如,`@Path` 注解用于指定资源的 URI 路径,`@GET` 和 `@POST` 等注解用于定义 HTTP 方法。 3. **资源匹配**:资源匹配是指根据传入的请求 URL ...
这个"apache-wink-1.3.0-src.tar.gz"文件是Apache Wink 1.3.0版本的源代码压缩包,提供了完整的源码,供开发者进行深入研究、定制和扩展。以下是关于Apache Wink、RESTful Web服务以及源码压缩包的一些详细知识点: ...
RESTful Web 服务和 Apache Wink
RESTful Web 服务和 Apache Wink
这个"apache-wink-1.2.1-incubating.tar.gz"文件是一个归档文件,通常包含完整的Apache Wink框架的所有组件、库和必要的配置文件,方便用户在本地环境中部署和使用。 Apache Wink的核心特性包括: 1. **RESTful ...
通过学习和使用Apache Wink,开发者可以构建高效、灵活且可扩展的RESTful服务,同时也可以利用其丰富的客户端支持来创建强大的Web应用程序。由于源代码的开放性,开发者还可以深入研究其内部机制,进一步优化和定制...
集成Spring和Apache Wink的主要目标是利用Spring的IOC容器管理Wink的组件,如资源、过滤器和消息处理器,以及利用Spring的数据访问和事务管理功能。以下是一些关键知识点: 1. **RESTful服务基础**:REST...
3. **JAX-RS兼容**:Apache Wink遵循Java API for RESTful Web Services (JAX-RS)规范,允许开发者使用注解来定义资源和操作,简化了REST服务的开发。 4. **客户端和服务器端支持**:Wink不仅提供了服务器端的实现...
2. **文档**:用户指南、开发者文档和API参考,帮助用户理解如何使用和扩展Wink。 3. **示例应用**:演示如何使用Wink创建REST服务的示例代码,是学习和调试的好起点。 4. **构建脚本**:如Maven的pom.xml文件,用于...
在本文中,我们将深入探讨Apache Wink的核心特性、用途以及如何解压和使用源代码。 **Apache Wink核心特性:** 1. **RESTful服务支持**:Wink提供了一套全面的API和工具来创建、部署和管理RESTful Web服务。它遵循...
Apache Wink的核心目标是简化开发RESTful服务,通过提供一组丰富的库和API,使得开发者可以轻松创建、测试和部署符合REST原则的服务。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发...
1. **服务器端组件**:Apache Wink提供了Servlet容器内的运行时环境,支持JAX-RS(Java API for RESTful Web Services)规范,允许开发者使用注解来定义资源类和方法,轻松创建RESTful服务。 2. **客户端库**:Wink...
6. **模块化设计**:Apache Wink被设计为模块化的,开发者可以根据需要选择安装和使用特定的组件,如HTTP服务器、消息处理器、JSON处理等。 在解压"apache-wink-0.1-incubating.tar.gz"后,你会得到一个名为"apache...
开发者可以使用Wink快速创建基于HTTP的Web服务,同时它还支持JSON和XML数据格式的处理。 在描述中提到的"依赖包",意味着在使用或编译Apache Wink 1.0时,可能需要额外的库或者组件。这可能包括JDK(Java ...
依赖包是指在使用Apache Wink时,可能还需要额外的库来支持特定功能,例如数据库连接、JSON解析等。确保正确地配置和引入这些依赖,是成功运行Wink应用的关键步骤。 总之,Apache Wink 1.1是一个强大的工具,用于...
"apache-wink-1.2.0-incubating.tar.gz"是该框架的一个发行版本,打包成的tarball文件,方便用户下载和安装。 Wink提供了一系列API和工具,用于简化RESTful服务的开发、测试和部署。这个1.2.0版本可能包含了对之前...
2. **文档**:可能包括用户指南、API文档、开发者指南等,帮助开发者理解如何使用和集成Wink。 3. **库文件**:包含了必要的JAR文件,如核心库、扩展模块等,这些都是运行和部署Wink应用程序所必需的。 4. **示例**...
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包下载,依赖包