文档章节

Jersey使用小结

ToEast
 ToEast
发布于 2016/04/20 17:02
字数 1143
阅读 102
收藏 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
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
Jersey+Spring:解决Jersey单实例问题

Jersey是一款优秀的webservice框架,它同时支持soap和rest两种协议,而且系出名门(oracle)。美中不足的是:Jersey是基于Servlet实现的,具有Servlet的单例特性,有线程安全问题的隐患(这点跟...

liangtee
2012/10/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringData JPA 在解析实体类字段时驼峰自动添加下划线问题

SpringData JPA 使用的默认命名策略是: ImprovedNamingStrategy 。用下划线转换驼峰名,如 authorId ,转换成 author_id 。这样就遇到了一个问题:实体中驼峰命名的列名转换成下划线后,在M...

Jacktanger
17分钟前
0
0
Android JNI开发系列(十)JNI访问 Java 实例变量和静态变量

JNI访问 Java 实例变量和静态变量 Java 中的实例变量和静态变量,在本地代码中如何来访问和修改。静态变量也称为类变量(属性),在所有实例对象中共享同一份数据,可以直接通过类名.变量名来...

蔡小鹏
22分钟前
0
0
jsapi4加载的首个图层的范围被默认作为地图范围,且不能修改的解决

在map加载的第一个图层的图层范围(fullExtent),会被默认设置为map的全图范围,且不能更改,从一般地图控件角度来说,应该有fullExtent属性,作为地图的全图范围,但很遗憾jsapi4.9还没有 ...

canneljls
22分钟前
0
0
JSON.stringify()

JSON.parse()与JSON.stringify()的区别 JSON.parse()【从一个字符串中解析出json对象】 例子: //定义一个字符串 var data='{"name":"goatling"}' //解析对象 JSON.parse(data) 结果是: na...

废柴
22分钟前
0
0
HashSet

前言 Set的实现类都是基于Map来实现的(HashSet是通过HashMap实现的)。 构造图如下: 蓝色线条:继承 绿色线条:接口实现 正文 对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保...

狼王黄师傅
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部