Apache Wink正在成为JAX-RS规范的事实上的实现之一。 JSON.org和Jettison,JSON同步的默认提供程序,存在一些问题。 例如,它们的数组表示形式和有限的返回类型使对JAX-RS服务及其客户端Ajax应用程序的编码变得困难。
本文概述了一种配置现有的启用Apache Wink的Web应用程序以使用Jackson JSON提供程序的方法。 通过为支持Jackson的简单JAX-RS Web服务使用示例代码 ,了解此提供程序的优势。
作为标准发行版的一部分,Apache Wink打包了两个JSON提供程序:JSON.org和Jettison实现。 这两个提供程序都存在使Wink服务与Ajax应用程序集成复杂化的问题。 由于JAXB要求包含XML元素,因此任何提供者都不能将Java列表直接序列化为JSON作为返回类型。 两家提供商都还存在其他问题,例如:
object : { array : ["element1", "element2"] }
object : { array : "element1" }
object : { }
显然,Javascript中不同结构的编码允许带来了额外的,不希望的复杂性。
Jackson的核心是一个JSON处理器,用于生成和解析Java对象的JSON表示形式。 还可以将Jackson配置为JAX-RS实现的JSON序列化提供程序。
作为JAX-RS JSON序列化提供程序,Jackson相对于JSON.org和Jettison具有许多优势,如下所述。
优点 | 描述 |
---|---|
能够本地序列化列表 | Jackson可以直接从服务返回字符串对象列表,而无需包装Xml元素。 |
数组处理 | Jackson具有出色的,可预测的阵列序列化工具。 |
速度 | 比其他提供商快得多。 |
发牌 | Apache许可证2.0已广为人知。 使用此许可证的组件可在商业和免费软件产品中使用。 |
本文中的示例的说明假定:
org.apache.wink.server.internal.servlet.RestServlet
配置为使用JAX-RS应用程序,如清单1所示。 <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提供程序(请参阅参考资料中的链接)。 在撰写本文时,Jackson团队并未为将Jackson与Apache Wink一起使用所需的所有库提供单个下载资源。 您将需要JAR文件的ASL或LGPL版本,如下所示。
JAR文件必须存在于Web项目的类路径中。 最简单的方法是将它们放在WEB-INF / lib目录中。 (您的Apache Wink JAR文件可能已经在此目录中。)
此时,Jackson JSON提供程序已作为Web应用程序的一部分被加载,但是尚未指示Apache Wink将其用于JSON序列化。
调整Wink servlet的已配置应用程序以加载提供程序,如清单2所示。
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;
}
}
Jackson为您提供了从其函数轻松返回Java List的机会,而无需包装JAXB XML元素。 清单3显示了一个示例。
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同步的默认提供程序,存在一些问题。 在本文中,您了解了一种配置现有的启用Apache Wink的Web应用程序以使用Jackson JSON提供程序的方法。 一个示例通过为支持Jackson的简单JAX-RS Web服务使用示例代码来突出说明此提供程序的优点。
翻译自: https://www.ibm.com/developerworks/java/library/wa-aj-jackson/index.html