Spring + Jersey构建发布Restful WebService

Spring和maven的搭建参考相关文档,本文只介绍与jersey有关配置。
环境:
Eclipse
4.1
JDK
1.6
OS
win7
Maven
3.1
spring 
2.5.6
jersey 
1.8
步骤:
1、搭建jersey环境
2、编写服务器端业务逻辑,发布rest接口
3、客户端调用  
一、在POM文件中添加配置:jersey在maven中的依赖包
1、 pom.xml添加
  • <!-- jersey -->

        <dependency>

        <groupId>com.sun.jersey</groupId> 
        <artifactId>jersey-core</artifactId> 
        <version>1.8</version>

      </dependency>

       <dependency> 

        <groupId>com.sun.jersey</groupId> 
        <artifactId>jersey-server</artifactId> 
        <version>1.8</version>

      </dependency>

      <dependency> 

        <groupId>com.sun.jersey</groupId> 
        <artifactId>jersey-client</artifactId> 
        <version>1.8</version>

      </dependency>

      <dependency> 

       <groupId>javax.ws.rs</groupId> 
         <artifactId>javax.ws.rs-api</artifactId> 
         <version>2.0-m10</version>

      </dependency>

      <dependency> 

        <groupId>javax.ws.rs</groupId> 
        <artifactId>jsr311-api</artifactId> 
        <version>1.1.1</version>

      </dependency>

      </dependency>

      <!-- jersey end --> 

  <!--  json -->
  <dependency>
   <groupId>com.sun.jersey</groupId>
   <artifactId>jersey-json</artifactId>
   <version>1.8</version>
   </dependency>
   <dependency>
   <groupId>org.codehaus.jackson</groupId>
   <artifactId>jackson-mapper-asl</artifactId>
   <version>1.8.8</version>
 </dependency>
  <!--  json end -->
 <!-- jersey 整合 spring -->
 <dependency>
            <groupId>com.sun.jersey.contribs</groupId>
            <artifactId>jersey-spring</artifactId>
            <version>1.8</version>          
</dependency>
   2、web.xml配置: 所有rest请求都经过spring过滤
          <!-- Jersey  spring 配置 --> 
     <servlet>
         <servlet-name>jerseyspring</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>发布服务所在包名</param-value>  
       </init-param>
            <load-on-startup>2</load-on-startup>  
        </servlet>
     <servlet-mapping>
         <servlet-name>jerseyspring</servlet-name>
         <url-pattern>/services/*</url-pattern>
     </servlet-mapping> 
二、编写服务端资源
1、编写实体对象bean:
User对象
package com.kuangchi.ws;

import java.io.Serializable;

import javax.xml.bind.annotation.XmlRootElement;

/**
 * @Description: TODO
 * @ClassName: User
 * @author kexi.yan
 * @date 2015年11月3日 上午11:12:44
 * 
 *
 */
@XmlRootElement
public class User implements Serializable{

	private static final long serialVersionUID = 8918720423835601602L;
	private String userName = "";
	private int age = 0;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String toString() {
		return "name:" + userName + " age:" + age;
	}
}
  Home对象
package com.kuangchi.ws;

import java.io.Serializable;

import javax.ws.rs.FormParam;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * @Description: TODO
 * @ClassName: Home
 * @author kexi.yan
 * @date 2015年11月3日 上午11:16:15
 * 
 *
 */
@XmlRootElement
public class Home implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 4801263392358100245L;
	@FormParam("roomno")
	private int roomNo;

	@FormParam("address")
	private String address;

	private String longtime;

	public int getRoomNo() {
		return roomNo;
	}

	public void setRoomNo(int roomNo) {
		this.roomNo = roomNo;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getLongtime() {
		return longtime;
	}

	public void setLongtime(String longtime) {
		this.longtime = longtime;
	}

	public String toString() {
		return "roomNo:" + roomNo + "  address:" + address + "  longtime:"
				+ longtime;
	}

}

2、编写资源接口

package com.kuangchi.ws;

import javax.ws.rs.BeanParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 * @Description: TODO
 * @ClassName: UserService
 * @author kexi.yan
 * @date 2015年11月3日 上午11:18:12
 * 
 *
 */
@Component
// 定义此类为spring组件,即bean类.
@Scope("prototype")
// Spring会针对每一个request请求都生成新的Jersey服务类实例,此方法不需要配置Spring RequsetContextListener
@Path("/restresource")
public class UserService {

	// 1、无参数返回json格式,如返回xml,将Produces参数修改为MediaType.APPLICATION_XML
	@GET
	@Path("/getUser")
	@Produces(MediaType.APPLICATION_JSON)
	public User getUser() {
		User user = new User();
		user.setUserName("sed");
		user.setAge(29);
		return user;
	}

	// 2、@PathParam("id")获取URI中指定规则的参数
	@GET
	@Path("getUser/{id}")
	@Produces(MediaType.TEXT_PLAIN)
	public String getUserId(@PathParam("id") String id) {
		return id;
	}

	// 3、@QueryParam 用于获取GET请求中的查询参数
	@GET
	@Path("getId")
	@Produces(MediaType.TEXT_PLAIN)
	public String getId(@QueryParam("id") String id) {
		return id;
	}

	// 4、输入参数为xml格式,输出为json格式。可以根据需要切换produces和consumes的类型
	@POST
	@Path("insertUser")
	@Produces(MediaType.APPLICATION_JSON)
	// 指定发送请求的 MIME 类型
	@Consumes(MediaType.APPLICATION_XML)
	// 指定响应所能接受的 MIME 类型
	public User insertuser(User user) {
		return user;
	}

	// 5、BeanParam 当请求参数很多时,比如客户端提交一个修改用户的PUT请求,请求中包含很多项用户信息
	@PUT
	@Path("insertUserFromBean")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public User inserthome(@BeanParam User user) {
		return user;
	}

	// 6、@FormParam 从POST请求的表单参数中获取数据
	@POST
	@Path("insertUserFromForm")
	@Consumes("application/x-www-form-urlencoded")
	@Produces(MediaType.TEXT_PLAIN)
	public String insertuser(@FormParam("username") String userName,
			@FormParam("age") int age) {
		User user = new User();
		user.setUserName(userName);
		user.setAge(age);
		return user.toString();
	}

	// 7、多参数传递
	@POST
	@Path("map")
	@Produces(MediaType.TEXT_PLAIN)
	public String getMap(MultivaluedMap<String, String> formParams) {
		String result = "who:" + formParams.getFirst("who") + " ; what:"
				+ formParams.getFirst("what");
		return result;
	}

	// 8、删除
	@DELETE
	@Path("deleteUser/{id}")
	@Produces(MediaType.TEXT_PLAIN)
	public String deleteUser(@PathParam("id") String id) {
		// System.out.println(uriInfo.getAbsolutePath().toString());
		return "delete " + id;
	}
}


三、客户端调用
  private static WebResource getWr(String USER_URL)  {
             Client c = Client.create();   // 创建一个 com.sun.jersey .api.client.Client 类的实例
     WebResource wr = c.resource(USER_URL);  // 建了一个 WebResponse 对象
     return wr;
    }
1、调用getUser
         代码:
System.out.println(getWr(USER_URL).get(String.class));

输出:
{"userName":"sed","age":29}

2、调用getUser/{id}
     代码
String result = getWr(USER_URL).path("hnsed").get(String.class) ;
System.out.println(result);
输出: 
hnsed

3、调用getId
代码:
String result = getWr(USER_URL).queryParam("id", "109").get(String.class);
System.out.println(result);
输出:
109
4、调用insertUser
代码:
User user = new User();
user.setUserName("hndes");
user.setAge(39);

String USER_URL = " http://localhost:8000/restful/services/restresource/insertUser";
MultivaluedMapImpl params = new MultivaluedMapImpl();
params.add("user", user);
String result = getWr(USER_URL).entity(user,MediaType.APPLICATION_XML).post(String.class);
System.out.println(result);
输出:
{"userName":"hndes","age":39}

5、调用insertUserFromBean
代码:
String USER_URL = " http://localhost:8000/restful/services/restresource/insertUserFromBean";
String json = "{\"userName\":\"szh\",\"age\":\"6\"}";
System.out.println(getWr(USER_URL).entity(json,MediaType.APPLICATION_JSON).put(String.class)); 
输出:
{"userName":"szh","age":6}

6、调用insertUserFromForm
代码:

Form form = new Form();
form.add("username", "sed");
form.add("age",39);
//ClientResponse 对象代表了一个客户端收到的 HTTP 响应。
ClientResponse response = getWr(USER_URL).type(MediaType.APPLICATION_FORM_URLENCODED) .post(ClientResponse.class, form);
int status = response.getStatus();   //获取对应请求的 HTTP 状态码
System.out.println(response.getEntity(String.class));
输出:
name:sed age:39

7、调用map
代码:
MultivaluedMap<String, String> params = new MultivaluedMapImpl();
params.add("who", "sed");
params.add("what","dohousework");
params.add("how","good");
params.add("where","hk");
params.add("when","long time");

String result = getWr(USER_URL).post(String.class,params);
System.out.println(result);
输出:
{what=[dohousework], how=[good], when=[long time], where=[hk], who=[sed]}

8、调用deleteUser
代码:
String result = getWr(USER_URL).path("109").delete(String.class);
System.out.println(result);
输出:
delete 109


注:1、Client 类是创建一个 RESTful Web Service 客户端的主要配置点。你可以使用它来配置不同的客户端属性和功能,并且指出使用哪个资源提供者。创建一个 Client 类的实例是一个比较昂贵的操作,所以尽量避免创建一些不需要的客户端实例。比较好的方式是尽可能地复用已经存在的实例。

   

2、通过使用 WebResource 对象来创建要发送到 Web 资源的请求,以及处理从 Web 资源返回的响应。例如,你可以使用 WebResource 对象来发送 HTTP GET、PUT、POST 以及 DELETE 请求。


五、FAQ
 Q:  Exception in thread "main" com.sun.jersey.api.client.UniformInterfaceException: POST  http://localhost:8000/restful/services/restresource/insertUser  returned a response status of 415 Unsupported Media Type 
         
A: 请检查服务器端和客户端 MIME类型是否保持一致
   
Q:
Exception in thread "main" com.sun.jersey.api.client.UniformInterfaceException: GET  http://localhost:8000/restful/services/restresource/deleteUser/109  returned a response status of 405 Method Not Allowed 
A: 请检查客户端调用的http方法和服务器端方法是否保持一致
          在碰到问题时继续增加


附录:
jersey常用注解解释
Annotation 作用 说明
@GET 查询请求 相当于数据库的查询数据操作
@POST 插入请求 相当于数据库的插入数据操作
@PUT 更新请求 相当于数据库的更新数据操作
@DELETE 删除请求 相当于数据的删除数据操作
@Path uri路径 定义资源的访问路径,client通过这个路径访问资源。比如:@Path("user")
@Produces 指定返回MIME格式 资源按照那种数据格式返回,可取的值有:MediaType.APPLICATION_XXX。比如:@Produces(MediaType.APPLICATION_XML)。即将要返回给client端的数据标识类型(MIME)。@Produces可以作为class注释,也可以作为方法注释,方法的@Produces注释将会覆盖class的注释。
@Consumes 接受指定的MIME格式 只有符合这个参数设置的请求才能访问到这个资源。比如@Consumes("application/x-www-form-urlencoded")。即用来指定可以接受client发送过来的MIME类型,同样可以用于class或者method,也可以指定多个MIME类型,一般用于@PUT@POST 
@PathParam uri路径参数 可以获取URI中指定规则的参数。写在方法的参数中,获得请求路径参数。比如:@PathParam("username")  String userName。
@QueryParam uri路径请求参数 用于获取GET请求中的查询参数。写在方法的参数中,获得请求路径附带的参数。比如:@QueryParam("desc")  String desc
@DefaultValue 设置@QueryParam参数的默认值 如果@QueryParam没有接收到值,就使用默认值。比如:@DefaultValue("description") @QueryParam("desc") String desc
@FormParam form传递的参数 接受form传递过来的参数。比如:@FormParam("name")  String userName
@BeanParam 通过Bena的形式传递参数 接受client传递的bean类型的参数,同时这个bean可以在属性上配置@FormParam用以解决client的属性名称和bean的属性名称不一致的问题。比如:@BeanParam  User user
@Context 获得一些系统环境信息 通过@Context可以获得以下信息:UriInfo、ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等
@XmlRootElement 将bean转换为xml 如果要讲bean以xml或json的格式返回,必须要这个注解。比如:

@XmlRootElement

public class User{...}

@XmlElements


@XmlElement


HTTP Methods
  GET 请求
读取/列出/检索单个或资源集合。使用 WebResource 类的 get() 方法来提交一个 HTTP GET请求到 Web 资源,String s = webResource.get(String.class); 这表示如果 WebResource 对象的 URL 是http://localhost:8000/restful/services/restresource/getUser那么一个 HTTP GET 请求将会发送到地址为 http://localhost:8000/restful/services/restresource/getUser 的资源
PUT 请求

更新现有资源或资源集合。 使用 WebResource 类的 put() 方法来提交一个 HTTP PUT 请求到 Web 资源。例如下面的代码展示了请求发送一个文本实体 foo:bar 到指定的 Web 资源:

ClientResponse response = webResource.type("text/plain").put(ClientResponse.class, "foo:bar");      

同样,你也可以在使用 put() 方法发送请求时指定查询参数,方法与使用 get() 方法时指定查询参数一样

  POST 请求
新建资源.一个 POST 请求相当于一个 GET 请求和一个 PUT 请求的综合,也就意味着,你可以使用 POST 请求来发送一个实体到指定的 Web 资源并且接收另一个实体。使用 WebResource 类的 post() 方法来发送一个 HTTP POST 请求到指定的 Web 资源。
 DELETE 请求
删除资源或资源集合。使用 WebResource 类的 delete() 方法来发送一个 HTTP DELETE 请求到指定的 Web 资源。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值