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中国
作者
相关推荐
-
多应用程序开发:挑战ALM
许多企业正在软件开发中经历同时开发多个软件的阶段,但怎样为业务应用程序开发制订短期和长期计划,以帮助他们的公司变得更成熟或为扩张累计能量?
-
享受热部署:java web应用程序
所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。对于Java应用程序来说,热部署就是在运行时更新Java类文件。
-
如何保证Web应用程序安全性?
Web应用程序是当今多数企业应用的前沿阵地。Web应用程序在一个复杂的混合性架构中可以发挥多种不同的功能。
-
如何利用现有服务构建SOA应用?
由于全球性网络的发展、异构信息系统的增加以及需求的灵活多变,传统的应用架构正在不断受到挑战。如今人们不再从事这些工作了:构建全新的应用程序……