当前位置: 首页 > 工具软件 > Apache Wink > 使用案例 >

如何使用wink框架_将Apache Wink与Jackson JSON处理器一起使用

鲁鹤轩
2023-12-01

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文件可能已经在此目录中。)

配置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

 类似资料: