Jersey使用小结
博客专区 > ToEast 的博客 > 博客详情
Jersey使用小结
ToEast 发表于2年前
Jersey使用小结
  • 发表于 2年前
  • 阅读 76
  • 收藏 0
  • 点赞 1
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 本文并不对Jersey进行全面的介绍,因为它涉及到的知识点太多;也不讲实际的应用过程,因为篇幅有点长,懒得写,只做Jersey使用的小总结,包括遇到的一些问题。

    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的简单使用,至于其他的使用方式或者更深入的知识点后续会继续研究。

共有 人打赏支持
粉丝 0
博文 4
码字总数 2933
×
ToEast
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: