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
代码:
String USER_URL = "http://localhost:8000/restful/services/restresource/getUser";System.out.println(getWr(USER_URL).get(String.class));
输出:
{"userName":"sed","age":29}
2、调用getUser/{id}
代码:String USER_URL = " http://localhost:8000/restful/services/restresource/getUser";String result = getWr(USER_URL).path("hnsed").get(String.class) ;System.out.println(result);输出:
hnsed
3、调用getId
代码:String USER_URL = " http://localhost:8000/restful/services/restresource/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
代码:String USER_URL = " http://localhost:8000/restful/services/restresource/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 USER_URL = " http://localhost:8000/restful/services/restresource/map";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 USER_URL = " http://localhost:8000/restful/services/restresource/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 资源。
|