如何使用wink框架

    技术2024-02-23  101

    Apache Wink正在成为JAX-RS规范的事实上的实现之一。 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服务与Ajax应用程序集成复杂化的问题。 由于JAXB要求包含XML元素,因此任何提供者都不能将Java列表直接序列化为JSON作为返回类型。 两家提供商都还存在其他问题,例如:

    JSON.org 使用JSON.org提供程序进行数组序列化是可以预见的,但是与Ajax交互时,这种行为是不可取的。 当呈现不同大小的数组时,JSON.org表示它们的方式有所不同: 2+ :“正确”的数组序列化。 例如: object : { array : ["element1", "element2"] } 1 :折叠数组。 例如: object : { array : "element1" } 0 :完全删除阵列。 例如: object : { }

    显然,Javascript中不同结构的编码允许带来了额外的,不希望的复杂性。

    抛弃 Jettison使用Badgerfish约定进行JSON生成,生成的结构在转换为Javascript对象后可能难以导航。

    杰克逊

    Jackson的核心是一个JSON处理器,用于生成和解析Java对象的JSON表示形式。 还可以将Jackson配置为JAX-RS实现的JSON序列化提供程序。

    作为JAX-RS JSON序列化提供程序,Jackson相对于JSON.org和Jettison具有许多优势,如下所述。

    表1. Jackson的优势
    优点 描述 能够本地序列化列表 Jackson可以直接从服务返回字符串对象列表,而无需包装Xml元素。 数组处理 Jackson具有出色的,可预测的阵列序列化工具。 速度 比其他提供商快得多。 发牌 Apache许可证2.0已广为人知。 使用此许可证的组件可在商业和免费软件产品中使用。

    为Jackson配置Apache Wink

    本文中的示例的说明假定:

    您已经配置了一个现有的动态Web项目,以将Apache Wink用作JAX-RS提供程序。 在web.xml文件中将Wink servlet org.apache.wink.server.internal.servlet.RestServlet配置为使用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网站上,下载最新版本的Jackson提供程序(请参阅参考资料中的链接)。 在撰写本文时,Jackson团队并未为将Jackson与Apache Wink一起使用所需的所有库提供单个下载资源。 您将需要JAR文件的ASL或LGPL版本,如下所示。

    core-(asl / lgpl):杰克逊核心功能 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; } }

    直接列表<?>序列化

    Jackson为您提供了从其函数轻松返回Java List的机会,而无需包装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同步的默认提供程序,存在一些问题。 在本文中,您了解了一种配置现有的启用Apache Wink的Web应用程序以使用Jackson JSON提供程序的方法。 一个示例通过为支持Jackson的简单JAX-RS Web服务使用示例代码来突出说明此提供程序的优点。


    翻译自: https://www.ibm.com/developerworks/java/library/wa-aj-jackson/index.html

    Processed: 0.016, SQL: 9