`
sb33060418
  • 浏览: 152476 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

REST(四)RESTEasy实现REST

    博客分类:
  • REST
阅读更多
RESTEasy是JBoss的一个开源项目,提供各种框架帮助你构建RESTful Web Services和RESTful Java应用程序。它是JAX-RS规范的一个完整实现并通过JCP认证。作为一个JBOSS的项目,它当然能和JBOSS应用服务器很好地集成在一起。但是,它也能在任何运行JDK5或以上版本的Servlet容器中运行。RESTEasy还提供一个RESTEasy JAX-RS客户端调用框架。能够很方便与EJB、Seam、Guice、Spring和Spring MVC集成使用。支持在客户端与服务器端自动实现GZIP解压缩。

其他RESTEasy介绍见官网:http://resteasy.jboss.org/。本节简单介绍RESTEasy2+spring4的集成及客户端访问。

1.spring web基础环境
见之前章节创建的web工程testRest。

2.REST地址
与上一节类似,设计RESTEasy模块/resteasy/*。

3.RESTEasy库
在项目pom.xml中加入RESTEasy依赖:
<properties>
	<!-- resteasy高版本要求jdk1.8,使用低版本 -->
	<resteasy.version>3.0.0.Final</resteasy.version>
</properties>
<dependencies>	
	...
	<!-- resteasy begin -->
	<dependency>
		<groupId>org.jboss.resteasy</groupId>
		<artifactId>resteasy-jaxrs</artifactId>
		<version>${resteasy.version}</version>
	</dependency>
	<dependency>
		<groupId>org.jboss.resteasy</groupId>
		<artifactId>resteasy-client</artifactId>
		<version>${resteasy.version}</version>
	</dependency>
	<dependency>
		<groupId>org.jboss.resteasy</groupId>
		<artifactId>resteasy-spring</artifactId>
		<version>${resteasy.version}</version>
	</dependency>
	<dependency>
		<groupId>org.jboss.resteasy</groupId>
		<artifactId>resteasy-jackson-provider</artifactId>
		<version>${resteasy.version}</version>
	</dependency>
	<!-- resteasy end -->
	...

版本使用3.0.0.Final,因为更新的版本要求jdk1.8才能运行。

4.Servlet
配置RESTEasy访问入口。
<!-- resteasy -->
<context-param>
	<param-name>resteasy.resources</param-name>
	<param-value>
		com.sunbin.test.resteasy.TeachersResource,com.sunbin.test.resteasy.TeacherResource
	</param-value>
</context-param>
<context-param>
	<param-name>resteasy.servlet.mapping.prefix</param-name>
	<param-value>/resteasy</param-value>
</context-param>
<listener>
	<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
	<servlet-name>resteasy</servlet-name>
	<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>resteasy</servlet-name>
	<url-pattern>/resteasy/*</url-pattern>
</servlet-mapping>

resteasy Servlet将拦截/resteasy/*下的所有访问。
RESTEasy与web、spring集成后,不需要再自己实现Application、Component等组件,也不需要配置文件进行路径配置,仅需要使用@Path注解。

5.实现api
新建com.sunbin.test.resteasy包,新增TeachersResource类,以实现/teachers路径的接口:
package com.sunbin.test.resteasy;

import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.springframework.beans.factory.annotation.Autowired;

import com.sunbin.test.teacher.pojo.Teacher;
import com.sunbin.test.teacher.service.TeacherService;

@Path("/teachers")
@Produces(MediaType.APPLICATION_JSON)
public class TeachersResource {

	@Autowired
	private TeacherService teacherService;

	@GET
	public Map get() {
		System.out.println("Resteasy TeachersResource.get");
		Map map = new HashMap();
		map.put("teachers", teacherService.list());
		return map;
	}

	@POST
	public Map post(@FormParam("age") int age, @FormParam("name") String name) {
		Map map = new HashMap();
		try {
			Teacher teacher = new Teacher();
			teacher.setName(name);
			teacher.setAge(age);
			System.out.println("Resteasy TeachersResource.post:" + teacher);
			teacherService.save(teacher);
			map.put("status", "y");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return map;
	}

}

路径注解@Path、返回类型注解@Produces、访问方法@GET、参数读取@FormParam,都和Jersey的JAX-RS相同。

重新部署项目后,访问http://localhost:8080/testRest/resteasy/teachers,发现报错:
java.lang.NullPointerException
com.sunbin.test.resteasy.TeachersResource.get(TeachersResource.java:29)
检查后发现是teacherService.list()语句中teacherService为null,@Autowired注解没有生效。
尝试使用xml配置方式实现teacherService注入,或使用jsr规范自有的@Inject、@Resource注解也不生效。

为什么会这样?分析是因为RESTEasy和spring的beanfactory之间依赖注入的问题。
RESTEasy官网手册推荐以下两种解决方法:
1.通过WebApplicationContextUtils工具类获取ApplicationContext对象
2.自定义工具类
具体使用方法见我之前的文章:spring4学习(三)在非Spring类中获取Bean

为了方便注入,这里采用第二种方法:定义Context工具类SpringContextHolder并配置至spring。之后需要对Resource类进行改造:
package com.sunbin.test.resteasy;

import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.sunbin.common.spring.SpringContextHolder;
import com.sunbin.test.teacher.pojo.Teacher;
import com.sunbin.test.teacher.service.TeacherService;

@Path("/teachers")
@Produces(MediaType.APPLICATION_JSON)
public class TeachersResource {

	private TeacherService teacherService;

	public TeachersResource() {
		super();
		// 不能自动注入,需要手动getBean赋值
		teacherService = (TeacherService) SpringContextHolder
				.getBean("teacherService");
		// TODO Auto-generated constructor stub
	}

	@GET
	public Map get() {
		System.out.println("Resteasy TeachersResource.get");
		Map map = new HashMap();
		map.put("teachers", teacherService.list());
		return map;
	}

	@POST
	public Map post(@FormParam("age") int age, @FormParam("name") String name) {
		Map map = new HashMap();
		try {
			Teacher teacher = new Teacher();
			teacher.setName(name);
			teacher.setAge(age);
			System.out.println("Resteasy TeachersResource.post:" + teacher);
			teacherService.save(teacher);
			map.put("status", "y");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return map;
	}

}

在TeachersResource类的构造方法中手动通过SpringContextHolder获取Bean,再赋值给resource。

同样的,新增TeacherResource类,以实现/teacher/{id}路径的接口:
package com.sunbin.test.resteasy;

import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.sunbin.common.spring.SpringContextHolder;
import com.sunbin.test.teacher.pojo.Teacher;
import com.sunbin.test.teacher.service.TeacherService;

@Path("teacher/{id}")
@Produces(MediaType.APPLICATION_JSON)
public class TeacherResource {

	private TeacherService teacherService;

	public TeacherResource() {
		super();
		teacherService = (TeacherService) SpringContextHolder
				.getBean("teacherService");
		// TODO Auto-generated constructor stub
	}

	@GET
	public Map get(@PathParam("id") int id) {
		System.out.println("Resteasy TeacherResource.get:" + id);
		Teacher teacher = new Teacher();
		teacher.setId(id);
		Map map = new HashMap();
		map.put("teacher", teacherService.get(teacher));
		return map;
	}

	@PUT
	public Map put(@PathParam("id") int id, @FormParam("age") int age,
			@FormParam("name") String name) {
		Map map = new HashMap();
		try {
			Teacher teacher = new Teacher();
			teacher.setId(id);
			teacher.setName(name);
			teacher.setAge(age);
			System.out.println("Resteasy TeacherResource.put:" + id + ":"
					+ teacher);
			teacherService.update(teacher);
			map.put("status", "y");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return map;
	}

	@DELETE
	public Map delete(@PathParam("id") int id) {
		Map map = new HashMap();
		try {
			System.out.println("Resteasy TeacherResource.delete:" + id);
			Teacher teacher = new Teacher();
			teacher.setId(id);
			teacherService.remove(teacher);
			map.put("status", "y");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return map;
	}

}


6.js测试
使用上一节的测试页面src\main\webapp\rest\index.jsp进行测试:
...
	<script type="text/javascript">
		// 测试框架
		//var restType = "jersey";
		//var restType = "restlet";
		var restType = "resteasy";
		//var restType = "restCxf";
		//var restType = "restMvc";
...

重新部署后,使用浏览器访问http://localhost:8080/testRest/rest,测试内容和Restlet测试相同。

7.RESTEasy Client测试
RESTEasy提供Client库用于测试REST接口。
新建TestResteasy类,代码如下:
package com.sunbin.test.resteasy;

import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Form;

import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;

public class TestResteasy {

	public static final String URL_BASE = "http://localhost:8080/testRest/resteasy/";

	public static void main(String[] args) {
		ResteasyClient client = new ResteasyClientBuilder().build();
		String module = "teacher";
		String url = "";
		String result = "";
		Entity<Form> entity = null;
		Form form = null;
		ResteasyWebTarget baseTarget = client.target(URL_BASE);
		ResteasyWebTarget target = null;

		url = URL_BASE + module + "s";
		System.out.println("get\t" + url);
		target = baseTarget.path(module + "s");
		result = target.request().get(String.class);
		System.out.println(result);

		url = URL_BASE + module + "s";
		System.out.println("post\t " + url);
		target = baseTarget.path(module + "s");
		form = new Form().param("age", "1").param("name", "a");
		entity = Entity.form(form);
		result = target.request().post(entity, String.class);
		System.out.println(result);

		url = URL_BASE + module + "s";
		System.out.println("get\t" + url);
		target = baseTarget.path(module + "s");
		result = target.request().get(String.class);
		System.out.println(result);

		url = URL_BASE + module + "/1";
		System.out.println("get\t " + url);
		target = baseTarget.path(module + "/1");
		result = target.request().get(String.class);
		System.out.println(result);

		url = URL_BASE + module + "/1";
		System.out.println("put\t " + url);
		target = baseTarget.path(module + "/1");
		form = new Form().param("age", "11").param("name", "aa");
		entity = Entity.form(form);
		result = target.request().put(entity, String.class);
		System.out.println(result);

		url = URL_BASE + module + "s";
		System.out.println("get\t" + url);
		target = baseTarget.path(module + "s");
		result = target.request().get(String.class);
		System.out.println(result);

		url = URL_BASE + module + "/1";
		System.out.println("delete\t " + url);
		target = baseTarget.path(module + "/1");
		result = target.request().delete(String.class);
		System.out.println(result);

		url = URL_BASE + module + "s";
		System.out.println("get\t" + url);
		target = baseTarget.path(module + "s");
		result = target.request().get(String.class);
		System.out.println(result);
	}
}

测试结果与Restlet类似。
分享到:
评论

相关推荐

    RESTEasy实现上传下载文件

    在本文中,我们将深入探讨如何使用RESTEasy和Guice框架实现文件的上传与下载功能。RESTEasy是一个基于Java的RESTful Web服务实现,它与Java EE应用服务器集成,而Guice是Google提供的一款轻量级依赖注入框架,帮助...

    Spring整合RestEasy示例工程源码

    - **创建REST服务**:定义REST接口和实现,使用RestEasy的注解如`@Path`、`@GET`、`@POST`等。 - **注册服务**:在Spring配置中注册REST服务的实现,确保它能在Spring容器中被管理。 - **测试**:编写测试用例,验证...

    resteasy helloworld demo

    RESTEasy 是一个开源的 Java 框架,它实现了 JAX-RS(Java API for RESTful Web Services)规范,使得开发者能够轻松地在 Java 应用程序中创建 RESTful 服务。JAX-RS 是一种用于构建 Web 服务的标准接口,它简化了...

    resteasy使用netty

    总结来说,RestEasy与Netty的结合使用是一种高效且灵活的实现REST服务的方法。通过Netty的高性能网络通信能力,我们可以构建一个不依赖于Servlet容器的REST服务器,同时享受RestEasy带来的便捷REST开发体验。在实际...

    resteasy jar包

    综上所述,"resteasy-jaxrs-2.1.0.GA"压缩包包含了一个强大的REST服务实现,提供了一整套工具和特性,让开发者可以高效、灵活地构建符合REST原则的Web服务。尽管现在有更新的版本,但对于了解RESTEasy的基本用法和...

    RESTEasy身份验证

    RESTEasy是Java中一个流行的RESTful Web服务框架,它允许开发者轻松地创建和消费REST API。在RESTEasy中,身份验证是确保只有授权用户能够访问受保护资源的关键机制。由于RESTEasy是基于Servlet容器运行的,因此它...

    restEasy 学习总结,附带源码

    RESTEasy 是一个 Java 框架,它实现了 JAX-RS(Java API for RESTful Web Services)规范,使得开发者能够轻松地构建基于 REST 的 Web 服务。RESTEasy 集成了多种 Java EE 容器,如 Tomcat、Jetty 等,同时也支持...

    resteasy开发手册

    RESTEasy是一款支持Java的RESTful Web Services实现,它是JAX-RS标准的一个参考实现。JAX-RS(Java API for RESTful Web Services)是一个Java编程语言的应用程序接口,用于开发基于REST架构风格的Web服务。RESTEasy...

    Netty-Resteasy-Spring

    JAX-RS: 是一套用java实现REST服务的规范。(全名Java API for RESTful Web Services) JAX-RS标注的内容: @Path,标注资源类或方法的相对路径 @GET,@PUT,@POST,@DELETE,标注方法是用的HTTP请求的类型 @...

    使用RESTEasy构建WebService简介

    RESTEasy是一个开源的JAX-RS实现,它允许开发者以简单的方式构建RESTful Web服务。JAX-RS是Java API for RESTful Web Services的缩写,是一个Java编程语言的API,用于开发Web服务和基于Web的应用程序。RESTEasy不仅...

    resteasy 需要jar包

    Resteasy 是一个开源的 JAX-RS 实现,它允许开发者构建 RESTful Web 服务,并在 Java 应用程序中轻松地使用这些服务。JAX-RS(Java API for RESTful Web Services)是 Java 中的一个标准,用于创建基于 HTTP 的 REST...

    resteasy设置timeout

    在IT行业中,RESTful API是服务端与客户端通信的常用方式,而RESTEasy是一个流行的Java框架,用于构建符合REST原则的Web服务。本篇将详细探讨如何在RESTEasy中设置超时时间,以及相关的源码解析和工具使用。 首先,...

    RESTEasy 入门实例

    RESTEasy 是一个开源的 JBoss 项目,它实现了 Java API for RESTful Web Services (JAX-RS) 规范,为 Java 开发者提供了一个简单易用的框架来创建 RESTful 服务。JAX-RS 是 Java 平台上的标准接口,用于构建 RESTful...

    resteasy所用能用到的jar包

    RESTEasy是一个开源的Java框架,它实现了JSR 311和JSR 339(JAX-RS)标准,用于在Java EE环境中构建RESTful Web服务。它提供了多种功能,包括注解驱动的接口、拦截器、转换服务、异常处理等。在使用RESTEasy时,通常...

    resteasy使用源码

    RESTEasy是基于JAX-RS(Java API for RESTful Web Services)规范的实现,该规范定义了如何在Java中创建RESTful服务。JAX-RS允许我们通过简单的注解来声明HTTP方法、资源路径和消息体处理器。 在JBoss 7.1中集成...

    resteasy参考文档及jar包

    RESTEasy是一款开源的Java框架,专门用于实现JAX-RS(Java API for RESTful Web Services)规范,使得开发RESTful Web服务变得更加简单。RESTEasy集成了多种Java EE应用服务器,如Tomcat、Jetty以及WildFly等,为...

    RestEasy简介

    RestEasy是一款基于Java的RESTful Web服务框架,它被广泛应用于JAX-RS(Java API for RESTful Web Services)规范的实现。RESTful架构风格是Web服务设计的一种流行方式,强调资源的识别和通过HTTP方法进行操作。...

    resteasy-jaxrs-2.3.2 源码

    通过对Resteasy的深入理解,开发者可以更有效地调试问题,优化服务性能,并构建出符合REST原则的高质量Web服务。 总的来说,"resteasy-jaxrs-2.3.2"源码分析对于任何对JAX-RS和RESTful服务感兴趣的开发者都是宝贵的...

    resteasy实例demo

    RestEasy是一个开源的Java框架,它实现了JSR 311(Java API for RESTful Web Services)和JSR 339(Java API for RESTful Web Services 2.0),用于构建高质量、基于REST原则的Web服务。这个实例Demo将帮助你深入...

    RESTEasy 简单实例

    RESTEasy 是一个开源的 JBoss 项目,它实现了 Java API for RESTful Web Services (JAX-RS) 规范,使开发人员能够轻松地在 Java 应用程序中创建 RESTful Web 服务。RESTEasy 与 Java EE 和 Java SE 兼容,并广泛应用...

Global site tag (gtag.js) - Google Analytics