2014年3月6日星期四

[]Jersey构建REST服务实战

本文自动转发自我的博客: http://www.haofengjing.org/2289.html

 由于参与移动项目,需要移动终端和服务端传递数据,经过技术对比分析,觉得基于REST模式的Web服务比较简洁易用,于是采取了Jersey开发, 一个Java规范下REST风格Web Service开发框架。最初选择的是Jersey1.8,后来由于运行环境的升级,导致Jersey也要升级到最新版本2.5.1。由于jersey2.x 版本实现的是JAX-RS 2.0规范,与 jersey1.x 相比有很大的改变,JSON转换也有不同。现把实现过程整理下来,供有需要的朋友参考!

一:环境介绍

(1)Jersey2.5.1 

(2)Eclipse 3.7 +Tomcat 7 +JDK 7

二:搭建步骤

(1)通过地址https://jersey.java.net/  下载jaxrs-ri-2.5.1.zip。

(2)通过Eclipse 创建动态工程RestDemo。

(3)解压jaxrs-ri-2.5.1.zip,拷贝下图列表中的JAR包到RestDemo\WebContent\WEB-INF\lib下。

(4)创建包路径  cn.com.vs.vo,创建User.java:

package cn.com.vs.vo;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement public class User { private String name; private String age; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }

(5)创建包路径  cn.com.vs.service,创建RestService.java:

package cn.com.vs.service;

import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType;

import cn.com.vs.vo.User;

@Path("/restService") public class RestService { @GET @Path("/getUserText") @Produces(MediaType.TEXT_PLAIN) public String getUserText() { return "Hello,World!"; } @GET @Path("/getUserXml") @Produces(MediaType.APPLICATION_XML) public User getUserXml() { User user  = new User(); user.setName("snail"); user.setAge("22"); user.setSex("male"); return user; } @GET @Path("/getUserJson") @Produces(MediaType.APPLICATION_JSON) public User getUserJson() { User user  = new User(); user.setName("snail"); user.setAge("22"); user.setSex("male"); return user; } }

(6)在 cn.com.vs 包路径下创建类 RestApplication.java

package cn.com.vs;

import org.glassfish.jersey.filter.LoggingFilter; import org.glassfish.jersey.server.ResourceConfig;

public class RestApplication extends ResourceConfig {

    public RestApplication() { //服务类所在的包路径 packages("cn.com.vs.service"); //打印访问日志,便于跟踪调试,正式发布可清除 register(LoggingFilter.class); }

}

(7)修改web.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance " xmlns="http://java.sun.com/xml/ns/javaee " xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd " xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd " id="WebApp_ID" version="3.0"> <display-name>RestDemo</display-name> <servlet> <servlet-name>mobile</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>cn.com.vs.RestApplication</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>

 <servlet-mapping> <servlet-name>mobile</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>

(8)在 Tomcat7 中部署运行,查看发布效果:

     获取 文本数据:

     获取XML数据:

  获取JSON数据:http://localhost:8080/RestDemo/rest/restService/getUserJson  ,会出现如下异常:

[org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class cn.com.vs.vo.User, genericType=class cn.com.vs.vo.User.] with root cause org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class cn.com.vs.vo.User, genericType=class cn.com.vs.vo.User.

说明:如果通过glassfish-4.0运行的话,是没任何问题的!如果通过tomcat,需要添加JSON转换器。

(9)解决获取JSON数据的异常,途径一:

     a)下载 jackson-all-1.9.11.jar  ,放到lib下。

     b)修改RestApplication.java,内容如下:

package cn.com.vs;

import org.codehaus.jackson.jaxrs.JacksonJsonProvider; import org.glassfish.jersey.filter.LoggingFilter; import org.glassfish.jersey.server.ResourceConfig;

public class RestApplication extends ResourceConfig {

    public RestApplication() { //服务类所在的包路径 packages("cn.com.vs.service");  //注册JSON转换器 register(JacksonJsonProvider.class); //打印访问日志,便于跟踪调试,正式发布可清除 register(LoggingFilter.class); }

}

(10)解决获取JSON数据的异常,途径二:

    a) 下载 glassfish-4.0.zip  ,解压,拷贝下列JAR到lib下:

      

   b)修改RestApplication.java,内容如下:

package cn.com.vs;

import org.glassfish.jersey.filter.LoggingFilter; import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.server.ResourceConfig;

public class RestApplication extends ResourceConfig {

    public RestApplication() { //服务类所在的包路径 packages("cn.com.vs.service"); //注册JSON转换器 register(JacksonFeature.class);  //打印访问日志,便于跟踪调试,正式发布可清除 register(LoggingFilter.class); }

}

(11)选择上述途径中的一种,然后发布启动,获取JSON数据,即可成功,如下:

 

没有评论:

发表评论