文档章节

Jersey使用小结

ToEast
 ToEast
发布于 2016/04/20 17:02
字数 1143
阅读 298
收藏 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
北碚
私信 提问
加载中

评论(0)

【SpringBoot】限制IP访问频率

引言 显示中存在恶意ip频繁请求情况,本文通过自定义注解+拦截器实现限制ip访问的频率 实现 1. 添加pom依赖 2. 添加自定义注解 3. 添加自定义异常 4. 添加自定义拦截器 interceptor http uti...

Francis-Leo
04/01
0
0
聊聊JerseyEurekaHttpClient的参数

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

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

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

周立_ITMuch
2017/10/24
531
0
Jersey2.x框架搭建简单的Restful API

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

centychen
2016/09/18
1.8K
7
Jersey 2.x 从Maven Archetype 创建一个新项目

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

honeymose
2018/11/08
38
0

没有更多内容

加载失败,请刷新页面

加载更多

mongodb服务挂了重启日志报错Out of memory

1、问题描述: 今天突然PHP同事给我说预发布的mongo挂了,我上去看了一下日志显示: 原因: 同事说他建了个索引,然后mongo就挂了,由于mongodb的重建索引的时候,吃掉所有内存,导致mongodb...

osc_b67rw1ne
44分钟前
16
0
数据库实验-数据查询语言

(1)查询学生的基本信息; select * from S; (2)查询“CS”系学生的基本信息; select * from S where Sdept =’CS’; (3)查询“CS”系学生年龄不在19到21之间的学生的学号、姓名; se...

osc_9q6q9p40
45分钟前
10
0
【赵强老师】Weblogic域和域的组成

一、什么是Weblogic WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于Java EE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和...

osc_52r4y6wv
46分钟前
17
0
ros gazebo it says it's incompatible with that RT

环境说明 ubuntu 16.04 osrf/ros:kinetic-desktop-full-xenial gazebo 7.0.0 问题 gzserver: /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/OgreMain/src/OgreRenderSystem.cpp:546: virtual......

osc_7nzqlmki
48分钟前
6
0
mysqldump导出数据库报mysqldump: Couldn't execute 'SELECT

mysqldump命令:   导出数据库:mysqldump -h ip -u root -p dbname > db.sql;   导出数据库中的某个表:mysqldump -h ip -u root -p dbname tablename > tablename.sql; 错误提示:   ......

osc_gxvh47u5
48分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部