文档章节

Jersey使用小结

ToEast
 ToEast
发布于 2016/04/20 17:02
字数 1143
阅读 110
收藏 1

    1. 前言

    Jersey是对Jax-rs规范(JSR 311, JavaEE 6的restful web服务接口, API定义在javax.ws.rs包里面)实现的轻量级restful框架,与它类似的框架还有好几个,比如Restlet(比Jax-rs还要早出现)、RestEasy、CXF等等。本文主要是介绍了Jersey的简单应用以及问题点。

    2. 应用总结

     主要从Jar包、配置、服务端开发以及客户端调用这四个方面说明。

  •     Jar包

      这个需要吐槽一下了,本人在使用中由于导入包的版本问题,出现了各种报错的情况。经过测试(不完全),比较靠谱的包(与spring整合)的组合方式如下(使用maven获取,会下载相关的一些jar包):

      1) jersey-spring 1.19+  jersey-server 2.18+ 

      2)jersey-spring 1.19+ jaxrs-ri 2.18+

      反正版本尽量高一点或者用最新的版本,同样的客户端的包也尽量高些。

      如果版本太低或者版本冲突就会出现一下的错误:

      1)只使用jersey-spring 1.19

java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;

      2)jersey-server或者jaxrs-ri版本太低

java.lang.NoClassDefFoundError: org/glassfish/jersey/spi/ThreadPoolExecutorProvider(jersey-common引起)

      3)如果不小心把jersey-spring3引入进来了,然后与jersey-spring 1.19共存,同时没有引入jersey-server或者jaxrs-ri包,恭喜你,这种情况在maven-jetty或者maven-tomcat中安然无恙,打包成war部署后就会发现,OH,MyGod!居然和1)中的错误一样。

    当然还有一些其他错误(具体原因忘记记录了),比如:

java.lang.NoSuchMethodError: org.glassfish.jersey.internal.util.PropertiesHelper.getValue(Ljava/util/Map;Ljava/lang/String;Ljava/lang/Object;Ljava/util/Map;)Ljava/lang/Object;

   总之,jar包尽量纯正一点,版本高一点,一般都会安全,否则就得慢慢去找哪个jar出现问题了。

  • 配置

    对于基本的应用,配置就比较简单了,只需要在web.xml添加相应的servlet

 <servlet>
    <servlet-name>jerseyApi</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>xxx.xxx.xxx; org.codehaus.jackson.jaxrs</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>jerseyApi</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

  其中,org.codehaus.jackson.jaxrs用于在服务端进行Json到Object之间的转换,也就是读取MessageBody中的数据转换到服务的Object中,响应时将Json写到MessageBody里面,这些都是自动进行的,比较方便,当然需要添加相关的Jar包。

  •     服务端

    服务端使用Jax-rs提供的注解就可以完成服务的开发。以下是做的一个POST服务,GET、PUT、DELETE这些也是类似的,这里都是使用的JSON作为交换类型,当然,还可以使用其他的类型,比如XML(需要借助JAXB的力量)

@POST
@Path("xxxx")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Map addNewUser(Map<String, Object> map) {
		
}

   服务端拿到Json数据并使用Jackson转换后会映射到Object中,主要是本人比较懒,比较喜欢用Map来存放数据,这里可以自定义POJO来作为服务端的数据对象。总之,服务端只管从Http Body中获取到Json数据,然后进行解析和转换,因此,客户端可以使用任何的调用方式以及数据类型,只要能够将数据转换成Json到Http Body中传输到服务端即可。

   由于和Spring集成,并在服务中使用容器中的Bean,因此除了在配置中添加SpringServlet之外,还需要在服务类上面添加@Component注解,这样就可以使用@Resource或者@Autowired来注入Bean了。不然在服务器启动后,spring并不能发现Jersey服务,也就不能将其纳入自己容器的管理范围。

  • 客户端

String url = URL;
Client client = ClientBuilder.newBuilder().build();
WebTarget wt = 
	   client
           .register(JacksonJsonProvider.class)
    	   .target(url);
		
Map<String, Object> params = new HashMap<String, Object>();
Entity<Map<String, Object>> entity = Entity.entity(params, MediaType.APPLICATION_JSON);
Response res = wt.request().post(entity);
System.out.println(res.readEntity(Map.class));

    调用方式还有很多,这里是基于Jax-rs调用。其中,client.register(JacksonJsonProvider.class)用于注册一个Json的解析器,它实现了MessageBodyReader和MessageBodyWriter接口,并且和web.xml中配置的org.codehaus.jackson.jaxrs的功能比较类似,都是用于Json的读写和转换。

   3. 总结

    总的来说,Jersey在使用上还是比较简单的,并且完全按照Jax-rs的规范实现,同时,在与Spring的集成上也比较合理,侵入性相对较低。这里只是介绍了Jersey的简单使用,至于其他的使用方式或者更深入的知识点后续会继续研究。

© 著作权归作者所有

共有 人打赏支持
ToEast
粉丝 0
博文 4
码字总数 2933
作品 0
北碚
私信 提问
聊聊JerseyEurekaHttpClient的参数

序 本文主要研究一下JerseyEurekaHttpClient的参数 JerseyEurekaHttpClientFactory eureka-client-1.8.8-sources.jar!/com/netflix/discovery/shared/transport/jersey/JerseyEurekaHttpCli......

go4it
05/17
0
0
Spring Cloud Edgware新特性之一:解决Eureka中Jersey 1.x版本过旧的问题-不使用Jersey

Spring Cloud是当前炙手可热的微服务开发框架。它的功能强大,组件丰富,设计优雅。目前Spring Cloud还在不断发展之中。 Spring Cloud即将发布 版本。该版本解决了不少Bug,新增了不少新特性...

周立_ITMuch
2017/10/24
0
0
Jersey 2.x 从Maven Archetype 创建一个新项目

创建 Jersey 工程需要使用 Apache 的 Maven 软件工程和管理工具。所有的Jersey产品模块都可以在 Maven中央库 中找到。这样的话 Jersey 可以非常容易和其他基于 Maven 的项目进行配置(non-S...

honeymose
11/08
0
0
Jersey2.x框架搭建简单的Restful API

Jersey2.x框架搭建简单的Restful API 最近想用Jersey框架搭建一个Restful API项目,上网找了一下教程,发现网上的demo都是直接使用class定义API,而个人的想法是使用interface定义API接口,具...

centychen
2016/09/18
1K
7
Jersey “Auto-Discoverable Features” 在 Maven 编译后失效

本文同步至 问题 原本 Jersey "Auto-Discoverable Features"(自动发现功能)中 JSON 解析在 eclipse 右键运行项目是正常的,但用 Maven 编译成 jar 后运行,就无法使用 JSON 解析了 Jersey "...

waylau
2015/09/19
41
0

没有更多内容

加载失败,请刷新页面

加载更多

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
14分钟前
0
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
31分钟前
12
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器,此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录,之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单,...

野雪球
32分钟前
1
0
Confluence 6 文档主题合并问答

在 Confluence 官方 前期发布的消息 中,文档主题在 Confluence 6.0 及其后续版本中已经不可用。我们知道你可能对这个有很多好好奇的问题,因此我们在这里设置了一个问答用于帮助你将这个主题...

honeymose
今天
2
0
java框架学习日志-2

上篇文章(java框架学习日志-1)虽然跟着写了例子,也理解为什么这么写,但是有个疑问,为什么叫控制反转?控制的是什么?反转又是什么? 控制其实就是控制对象的创建。 反转与正转对应,正转...

白话
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部