`

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

    博客分类:
  • rest
阅读更多
最近项目里面要使用rest或者webservice来实现一些对外的接口。



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

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

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



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

最终权衡之下选择了Jersey。

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


1.资料,在线文档。

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

可以通过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;
	}  
	

}





然后通过浏览器发布出去,在浏览器中即可通过
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)

 

 

附件包括

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

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

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


引用自
http://xosadan.iteye.com/blog/1119235
分享到:
评论

相关推荐

    jersey+spring实例代码(包括文件上传)

    【标题】"jersey+spring实例代码(包括文件上传)"所涉及的知识点主要集中在使用Jersey作为RESTful服务框架与Spring框架集成,并实现文件上传功能。让我们深入了解一下这两个技术及其在实际项目中的应用。 **Jersey**...

    jersey+spring+srpingmvc实现上传

    【标题】:“jersey+spring+springmvc实现上传” 在Web开发中,文件上传功能是一项常见且重要的任务。本示例将介绍如何结合Jersey、Spring和Spring MVC框架来实现这一功能。Jersey是Java RESTful Web服务的实现,而...

    Jersey2.13+spring3.2.3入门实例

    "tomcat webapp"文件夹包含的是部署到Tomcat服务器的应用结构,包括WEB-INF下的web.xml和lib目录中的库文件。 总的来说,"Jersey2.13+spring3.2.3入门实例"是一个很好的起点,帮助开发者理解如何在实际项目中结合...

    Jersey+Spring:解决Jersey单实例问题

    这意味着所有客户端请求都会共享同一个服务实例,这在多线程环境下可能会引发线程安全问题。 为了解决这个问题,可以结合使用 Jersey 和 Spring 进行集成。Spring 提供了强大的依赖注入和管理 Bean 的能力,可以...

    Jersey+spring Demo

    【标题】"Jersey+Spring Demo" 是一个基于Java的Web服务开发实例,它整合了两个重要的技术框架:Jersey和Spring。这个示例旨在帮助开发者理解如何在J2EE环境中构建RESTful Web服务,同时利用Spring框架进行依赖注入...

    jersey-server-1.8.jar

    jersey-server-1.8.jar jersey-server-1.8.jar jersey-server-1.8.jar jersey-server-1.8.jar jersey-server-1.8.jar jersey-server-1.8.jar jersey-server-1.8.jar jersey-server-1.8.jar jersey-server-1.8.jar ...

    jersey加入spring支持

    5. **配置 Servlet**:在非 Spring Boot 环境下,你可能还需要配置一个 Servlet 来处理 Jersey 请求。这通常在 `web.xml` 文件中完成,但 Spring Boot 自动配置了这个过程,所以你不需要手动配置。 6. **测试和运行...

    jersey+spring+mybatis整合

    在Spring中,MyBatis可以通过Spring的SqlSessionFactoryBean和MapperScannerConfigurer进行集成,使得我们可以在不写大量DAO代码的情况下执行数据库操作。 在"jersey+spring+mybatis"整合中,Jersey作为REST服务的...

    Spring4整合Jersey2.9

    在本文中,我们将深入探讨如何将Spring4框架与Jersey2.9进行集成,以便创建一个功能丰富的RESTful Web服务。这个入门案例采用Maven作为项目构建工具,使得整个过程更加简便。 首先,理解Spring4和Jersey2.9的核心...

    jersey完整实例代码

    这个"jersey完整实例代码"提供了完整的项目结构和源码,适合初学者和有经验的开发者快速上手并理解如何在实际项目中应用Jersey。 1. **RESTful Web服务**: REST(Representational State Transfer)是一种网络应用...

    java应用程序实现jetty 集成jersey 和spring

    在Jetty和Jersey的环境中整合Spring,主要步骤有: 1. 引入Spring依赖:确保项目包含Spring的核心库和其他必要模块。 2. 配置Spring:创建Spring配置文件,定义Bean和它们之间的依赖关系。 3. 使用Spring的...

    jersey 2.2 +spring 3.1.0.RELEASE+hibernate 3.3.1.GA maven 配置文件

    标题 "jersey 2.2 +spring 3.1.0.RELEASE+hibernate 3.3.1.GA maven 配置文件" 暗示了一个集成开发环境,其中涉及到三个主要的技术组件:Jersey、Spring 和 Hibernate。这个配置文件是基于 Maven 构建系统的,用于...

    spring4.x 集成 jersey2.x 实现对外提供接口服务

    在本文中,我们将深入探讨如何将Spring 4.x框架与Jersey 2.x结合,以构建一个能够对外提供RESTful接口服务的系统。这个过程包括了配置、组件整合以及实际的API开发。以下是对整个集成过程的详细说明。 首先,让我们...

    java jersey spring 集成 开发restful API 服务

    Spring还包含了Spring MVC模块,用于构建Web应用,但与Jersey集成可以实现更灵活、高性能的REST服务。 集成Jersey和Spring的关键在于Spring的Servlet容器,如Spring Boot的嵌入式Tomcat。首先,我们需要在项目中...

    Spring+Jersey+Hibernate+MySQL+HTML实现用户信息CRUD案例源码

    本案例主要展示了如何使用Spring、Jersey、Hibernate和MySQL这些技术来实现一个完整的用户信息管理系统的后端逻辑,并结合HTML进行前端展示,实现用户信息的创建(Create)、读取(Read)、更新(Update)和删除...

    jersey整合spring示例,亲测可行

    通过以上步骤,我们可以成功地将 Jersey 和 Spring 整合在一起,利用 Spring 提供的依赖注入、事务管理等特性,同时利用 Jersey 实现 RESTful Web 服务。这个过程可能会遇到一些问题,但只要按照正确的步骤和方法,...

    jersey-archive-1.8.rar

    在“jersey-archive-1.8”中,这些 JAR 文件可能包括核心库、扩展模块以及依赖的第三方库,使得开发者能够直接导入项目,快速搭建起 RESTful 服务环境。 1. **Jersey Core**: 这是 Jersey 的核心组件,提供 JAX-RS ...

    jersey+spring

    项目中包含了jersey资源类、spring配置文件以及前端与后端交互的示例代码,读者可以通过研究这个示例进一步理解jersey和spring的集成。 总结 jersey+spring的组合提供了强大且灵活的RESTful服务开发能力,结合...

    jersey-spring-1.18.jar

    com.sun.jersey.spi.spring.container.servlet.SpringServlet需要此包的支持,使用spring3.1.1开发web service project时,用于添加Spring框架支持,使用IOC容器接管所有对象实例。解决在web service project中使用...

Global site tag (gtag.js) - Google Analytics