jesery与spring集成java
一、jersey在maven中的依赖包web
<!-- jersey 相关的包 --> <!-- jersey客户端相关包--> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.18.1</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.18.1</version> </dependency> <!-- jersey 服务器端相关包--> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-bundle</artifactId> <version>1.18.1</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.18.1</version> </dependency> <!-- genson处理服务器端json数据的重要jar--> <dependency> <groupId>com.owlike</groupId> <artifactId>genson</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <classifier>jdk15</classifier> <version>2.4</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>com.sun.jersey.contribs</groupId> <artifactId>jersey-spring</artifactId> <version>1.18.1</version> <!-- 去除自带的spring版本 --> <exclusions> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-context</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-web</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-aop</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-webmvc</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <!-- ****jersey 相关包****end*** -->
2.web.xml配置:spring
<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> </init-param> <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> </servlet>
3.参数支持和接口数据库
@PathParam用来表示Restful风格下在URL中的id等标识。json
@QueryParameter能够转换任何有以String为参数的构造函数的类,还能够设定defaultValue, 当参数为空时会自动抛异常api
@POST+ @Consumes 以POST方式传递XML或JSON编码的Java对象浏览器
@Context UriInfo,@Context HttpHeaders, @Context HttpServletRequest 获取灵活的,不固定的参数. 能够从原版HttpServletRequest中获取,也能够用封装好的更方便的UriInfo和HttpHeaders.服务器
4.使用Jackson处理JSONmvc
在classpath里加入jersey-json.jar后,在服务端,web.xml里SpringServlet的定义要加入app
<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; } }
而后经过浏览器发布出去,在浏览器中便可经过
http://localhost:8080/api/bookapi/getUserByXML得到一个xml格式的对象
http://localhost:8080/api/bookapi/setUser能够对一个user对象进行赋值
http://localhost:8080/api/bookapi/getUserXmlById能够传入一个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)