Jersey1.8在spring环境下的实现 包括实例代码

最近项目里面要使用rest或者webservice来实现一些对外的接口。



查了很多资料,最后选择了Restlet、Apache CXF、Jersey。

Restlet是抛弃了servlet api,自身实现了一些api,最关键的是没有提供spring的集成。

CXF很好,很强大,但是觉得它的json不爽,总是要先绕道jaxb。



Jersey是sun推出来的,很轻量、很环保、支持JAX-RS规范,据说要整合到jdk中去的。

最终权衡之下选择了Jersey。

Jersey的官方网站[url]http://jersey.java.net/[/url],相关文件可以在里面下载的。


1.资料,在线文档。

[url]http://jersey.java.net/nonav/documentation/latest/getting-started.html[/url]

可以通过maven进行环境的搭建。

我没有使用maven的习惯,最后手工下载的,下载了好久,基本把所有插件都下载到了。

这边附近只能上传10M,上传一张相关的lib截图,需要的另外附上。

2.与spring集成

在classpath里里加入jersey-spring.jar,web.xml里面划一个url如/restapi/* 归Jersey的SpringServlet管即可。 然后SpringServlet就会在Spring的Context里查找支持某个具体path的Bean来出来处理请求。

    
<!-- Jersey 配置 -->
<servlet>
<servlet-name>JerseyServlet</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>com.tianque.locationtalk.api</param-value>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>

</init-param>
</servlet>



3.参数支持和接口

@PathParam用来表示Restful风格下在URL中的id等标识。

@QueryParameter可以转换任何有以String为参数的构造函数的类,还可以设定defaultValue, 当参数为空时会自动抛异常

@POST+ @Consumes 以POST方式传递XML或JSON编码的Java对象

@Context UriInfo,@Context HttpHeaders, @Context HttpServletRequest 获取灵活的,不固定的参数. 可以从原版HttpServletRequest中获取,也可以用封装好的更方便的UriInfo和HttpHeaders.


4.使用Jackson处理JSON

在classpath里加入jersey-json.jar后,在服务端,web.xml里SpringServlet的定义要加入

<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>


5.要生成rest的service类

pojo对象,必须加入@XmlRootElement,用于标识对象转化成xml或者json


package com.xxx.locationtalk.api;

import javax.xml.bind.annotation.XmlRootElement;


@XmlRootElement
public class User {

public Long userId;
public String userName;
public String nickName;

public User(){

}
public User(Long userId,String userName,String nickName){
this.userId =userId;
this.userName=userName;
this.nickName=nickName;
}
}


具体映射出去的service类,其中调用了某个spring的service去读取数据库,各个不同的url实现了xml的对象输出,json对象的输出,以及list对象的输出,以及一些赋值操作和json对象赋值操作。


package com.xxx.locationtalk.api;


import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.xxx.locationtalk.domain.MobileNumber;
import com.xxx.locationtalk.service.MobileNumberService;

@Component
@Scope("request")
@Path("/bookapi")
public class BookService {
@Autowired
private MobileNumberService mobileNumberService;

public MobileNumberService getMobileNumberService() {
return mobileNumberService;
}

public void setMobileNumberService(MobileNumberService mobileNumberService) {
this.mobileNumberService = mobileNumberService;
}
//外部传过来的参数
@QueryParam("id") String userId;

@GET
@Produces(MediaType.TEXT_PLAIN)
public String helloWorld() {
String ret = "Hello World!";
return ret;
}

// 子路径
@Path("getUsers")
@GET
@Produces( {MediaType.APPLICATION_XML })
public List<User> getUsers() {
List<User> users = new ArrayList<User>();
for (long i = 1; i < 5; i++) {
User user = new User();
user.userId=(i);
user.userName=("yuhan" + i);
user.nickName=("supben" + i);
users.add(user);
}
return users;
}

// 子路径
@Path("getUserById")
@GET
@Produces( {MediaType.APPLICATION_JSON })
public User getUsersById(){
User user = new User();
//使用spring的类读取数据库信息,随便赋值
MobileNumber object=mobileNumberService.getMobileNumberById(Long.valueOf(userId));
user.userId=object.getId();
user.userName=object.getUsersName();
user.nickName=object.getMobileNumber();
return user;
}
@Path("getUserXmlById")
@GET
@Produces( {MediaType.APPLICATION_XML })
public User getUsersByIdForXML(){
User user = new User();
MobileNumber object=mobileNumberService.getMobileNumberById(Long.valueOf(userId));
user.userId=object.getId();
user.userName=object.getUsersName();
user.nickName=object.getMobileNumber();
return user;
}
@Path("setUser")
@PUT
@Produces( {MediaType.APPLICATION_JSON })
public User setUser(User user){
if(user==null){
System.out.println("数值为空!!");
user.userId=(13486197987L);
user.userName=("yuhan");
user.nickName=("supben");
}else{
System.out.println("user.userId="+user.userId);
System.out.println("user.userName="+user.userName);
System.out.println("user.nickName="+user.nickName);
user.userId=(user.userId);
user.userName=(user.userName);
user.nickName=(user.nickName);
}

return user;
}
// 子路径
@Path("getUserByXML")
@GET
@Produces( {MediaType.APPLICATION_XML })
public User getUserByIdWithXML() throws UnsupportedEncodingException{
User user = new User();
user.userId=(10000L);
user.userName=URLEncoder.encode(("哈哈"), "utf-8");
user.nickName=URLEncoder.encode(("老色狼"), "utf-8");
return user;
}


}




然后通过浏览器发布出去,在浏览器中即可通过
[url]http://localhost:8080/api/bookapi/getUserByXML[/url]获得一个xml格式的对象
[url]http://localhost:8080/api/bookapi/setUser[/url]可以对一个user对象进行赋值
[url]http://localhost:8080/api/bookapi/getUserXmlById[/url]可以传入一个id参数,获得一个xml格式的对象

6.client的demo演示

package com.xxx.locationtalk.api;

import java.io.UnsupportedEncodingException;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.json.JSONConfiguration;
import com.sun.jersey.core.util.MultivaluedMapImpl;
import com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider;

public class ClientDemo{
public static void main(String[] args) throws UnsupportedEncodingException{
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);


Client c = Client.create(clientConfig);
String url = "http://localhost:8080/api/bookapi";
WebResource r = c.resource(url);

User user = new User();
user.userId=1000L;
user.userName="江江123";
user.nickName="老色狼";

System.out.println("状态码="+r.path("setUser").accept(new String[] {MediaType.APPLICATION_JSON}).
entity(user, MediaType.APPLICATION_JSON).put(ClientResponse.class).getStatus());


MultivaluedMap<String, String> param = new MultivaluedMapImpl();
param.add("userId", "10000");
param.add("userName", "脏话");
param.add("nickName", "脏话色狼");

System.out.println(r.queryParams(param)
.type(MediaType.APPLICATION_JSON).post(String.class));


}
}


这个client演示了俩种rest的实现方法
输入URL Query参数 client.path("/xxx").queryParam("name", name)
输入JSON编码的对象 client.path("/xxx").entity(user, MediaType.APPLICATION_JSON)





附件包括

一张相关的jersey用到的所有lib截图

官方下载的最新jersey说明文档

官方下载的jersey1.8.zip,包括核心的lib以及doc


引用自
[url]http://xosadan.iteye.com/blog/1119235[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值