文档章节

Jersey使用小结

ToEast
 ToEast
发布于 2016/04/20 17:02
字数 1143
阅读 93
收藏 1
点赞 1
评论 0

    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

Jersey 异常处理

在默认情况下,jersey处理业务层抛出的异常,生成http的500状态码,不会针对不同的异常生成不同的状态码。 jersey处理异常,主要有两种方式。 1、实现javax.ws.rs.ext.ExceptionMapper<T>,T...

隆回水哥 ⋅ 2015/06/10 ⋅ 0

Jersey “Auto-Discoverable Features” 在 Maven 编译后失效

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

waylau ⋅ 2015/09/19 ⋅ 0

Java Jersey使用總結

关于作者 马隆博(Lenbo Ma),Java,Javascript Blog: [http://mlongbo.com][1] E-Mail:mlongbo at gmail.com 创建于:2013/07/26 转载请注明出处: [http://mlongbo.com/2015/Java Jersey2......

空谷幽兰_ ⋅ 2013/08/14 ⋅ 13

Jersey2.x框架搭建简单的Restful API

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

centychen ⋅ 2016/09/18 ⋅ 7

Jersey+Spring:解决Jersey单实例问题

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

liangtee ⋅ 2012/10/03 ⋅ 0

Jersey1.x + Spring 依赖注入出现 空指针异常

在使用rest风格和Spring的依赖注入做一个demo的时候。依赖注入 出现空指针异常 The RuntimeException could not be mapped to a response, re-throwing to the HTTP container java.lang.Nu...

Jeremy_pan ⋅ 2015/03/13 ⋅ 0

在openshift上使用jersey1.8

。。。 在openshift上使用jersey1.8 ,是很容易的事。 Jersey1.8 使用了 首先,我们有一个空的JBoss Enterprise Application Platform 6.0 我之前的账户在使用openshift的时候,已经耗尽3个空...

LiangShao ⋅ 2013/03/24 ⋅ 1

使用拦截器分析 springcloud 调用链--spring-cloud-invoke-link

使用springMVC的拦截器和jersey的filter分析springcloud的调用连,本jar包只是在拦截器和filter里面打印了 invokeLinkId和count,具体的分析需要根据实际情况将数据弄其他地方进行数据分析。...

赵伟伟 ⋅ 2017/06/10 ⋅ 0

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

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

周立_itmuch ⋅ 2017/10/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部