- 浏览: 150321 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
守望麦穗:
楼主好, 我按着你的步骤查找问题 ,到第二步,也没有自定义U ...
Spring Security3边学边写(N)会话管理和并行控制 -
sb33060418:
Notify 写道楼主,但是配置<concurrency ...
Spring Security3边学边写(N)会话管理和并行控制 -
Notify:
楼主,但是配置<concurrency-control ...
Spring Security3边学边写(N)会话管理和并行控制 -
409421884:
你好,我也在做这个功能,但sessionRegistry这个东 ...
Spring Security3边学边写(N)会话管理和并行控制 -
sb33060418:
左眼的彼岸 写道sb33060418 写道左眼的彼岸 写道谢谢 ...
Spring Security3边学边写(N)会话管理和并行控制
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依赖:
版本使用3.0.0.Final,因为更新的版本要求jdk1.8才能运行。
4.Servlet
配置RESTEasy访问入口。
resteasy Servlet将拦截/resteasy/*下的所有访问。
RESTEasy与web、spring集成后,不需要再自己实现Application、Component等组件,也不需要配置文件进行路径配置,仅需要使用@Path注解。
5.实现api
新建com.sunbin.test.resteasy包,新增TeachersResource类,以实现/teachers路径的接口:
路径注解@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类进行改造:
在TeachersResource类的构造方法中手动通过SpringContextHolder获取Bean,再赋值给resource。
同样的,新增TeacherResource类,以实现/teacher/{id}路径的接口:
6.js测试
使用上一节的测试页面src\main\webapp\rest\index.jsp进行测试:
重新部署后,使用浏览器访问http://localhost:8080/testRest/rest,测试内容和Restlet测试相同。
7.RESTEasy Client测试
RESTEasy提供Client库用于测试REST接口。
新建TestResteasy类,代码如下:
测试结果与Restlet类似。
其他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类似。
发表评论
-
REST(五)CXF实现REST
2017-08-14 16:49 725Apache CXF以前一般用来开发基于SOAP协议的Web ... -
REST(三)Restlet实现REST
2017-06-12 17:13 2365Restlet项目为“建立REST概念与Java类之间的映射” ... -
REST(二)Jersey实现REST
2017-05-26 16:33 1948Jersey是JAX-RS(JSR311)开源参考实现,用于构 ... -
REST(一)REST和JAX-RS
2017-05-25 16:08 1364最近重新整理了一下代码,把java实现REST api的几种框 ... -
Restlet 2.0 边学边写(八)使用jQuery和ajax实现对Restlet资源的CRUD操作
2013-01-12 01:20 2906上一次实践实现了各方 ... -
Restlet 2.0 边学边写(七)Restlet返回xml和json数据格式
2013-01-07 10:29 5324上一次实践实现了html form来访问Restlet的PUT ... -
Restlet 2.0 边学边写(六)使用html form访问Restlet的PUT和DELETE
2013-01-04 15:55 3914上一次实践实现了POST、PUT和DELETE方法,并使用ht ... -
Restlet 2.0 边学边写(五)Restlet的POST、PUT和DELETE
2012-12-26 17:54 4681上一次实践是将Restlet与spring集成,本次实践是将实 ... -
Restlet 2.0 边学边写(四)Restlet与spring集成
2012-12-20 17:27 5873上一次实践是使用Component来发布多个Resource。 ... -
Restlet 2.0 边学边写(三)使用Component发布多个Application
2012-12-19 18:25 3125很久没更新这篇博客了,今天继续。 上一次实践是一个Appli ... -
Restlet 2.0 边学边写(二)发布多个Resource
2012-01-11 03:39 3557上一次实践是一个Application绑定一个Resource ... -
Restlet 入门
2012-01-11 03:06 2532我学习Restlet是从ajax写的Restlet实践系列博客 ... -
Restlet 2.0 边学边写(一)第一步
2012-01-11 02:42 7513关于Rest的起源和框架、入门资料的一些东西大家可以去看看aj ...
相关推荐
JAX-RS: 是一套用java实现REST服务的规范。(全名Java API for RESTful Web Services) JAX-RS标注的内容: @Path,标注资源类或方法的相对路径 @GET,@PUT,@POST,@DELETE,标注方法是用的HTTP请求的类型 @...
该资源是java restful的应用框架resteasy---实现了jax-rs规范的一个demo,如有疑问请联系caizhh2009@gmail.com
Resteasy英文文档,开发rest风格的API接口
介绍了RESTEasy中的安全机制的使用方法
resteasy资料整理,使技术人员快速入门。快速开发rest接口。
resteasy在jboss7.1中的使用介绍,源代码,两种方式,自动注册rest service以及在程序中实现
RESTEasy 项目是 JAX-RS 的一个实现,集成的一些亮点: * 不需要配置文件,只要把JARs文件放到类路径里面,添加 @Path 注解就可以了。 * 完全的把 RESTEeasy 配置作为Seam 组件来看待。 * HTTP 请求由Seam来提供...
高枕无忧 RESTEasy是一个JBoss.org项目,旨在提供用于开发Java中的客户端和服务器RESTful应用程序和服务的生产力框架。 它主要是JAX-RS的实现,但是您可以在存储库中找到其他一些实验代码。 该项目页面可以在上找到...
RestEasy技术说明.docx REST_cn.pdf 编写REST服务教程.pdf
该Spring Boot启动器具有完整的功能,上面具有ZERO PayPal特定的代码,并且可以由希望具有REST端点并更喜欢RESTEasy作为JAX-RS实现的任何常规Spring Boot应用程序正常使用。 另外,此RESTEasy Spring Boot启动程序...
RESTEasy是JBoss的一个开源项目,提供各种框架帮助你构建RESTful Web Services和RESTful Java应用程序。它是JAX-RS规范的一个完整实现并通过JCP认证。
它使用 RestEasy 库,但您可以使用我的接口使用另一个 REST 实现来实现自己的客户端。 用 使用很简单。 创建工厂,然后创建您想要的客户端(CommunityClient、CollectionClient、ItemClient、BitstreamClient),您...
任何想要具有REST端点并且更喜欢RESTEasy作为JAX-RS实现的常规Spring Boot应用程序都可以使用此Spring Boot启动器。 另外,此RESTEasy Spring Boot启动程序将按预期方式与Spring集成,这意味着每个也是Spring Bean...
resteasy-spring-netty Resteasy + Spring + Netty sample Inject resteasy ...JAX-RS: 是一套用java实现REST服务的规范。(全名Java API for RESTful Web Services) JAX-RS标注的内容: @Path,标注资源类或方
休息轻量级的JAX-RS(RestEasy)像vert.x verticles的注释处理器Rest.Vertx仍处于测试阶段,因此请报告发现的所有。 强烈建议您参与并改进现有的代码。 这个项目是否可以帮助您减少开发时间? 保持运行,并捐赠饼干...
大摇大摆swagger-swagger 项目用于展示一个 swagger-resteasy 示例项目,以及如何在 Wildfly 应用服务器中集成 swagger 和 Resteasy。 它可能也适用于其他应用程序服务器。究竟什么是招摇? Swagger 是一个库,用于...
resteasy jar包,2.1GA版本
resteasy开发Demo及文档,可以直接使用
这是一个示例应用程序,通过RestEasy-Netty 3公开了REST API。 此外,此示例应用程序还展示了如何将Swagger和Jolokia嵌入到其中。建立 mvn package推出解压缩软件包(restreasy-netty-sample-1.0-SNAPSHOT.tar.gz)...
DHC_0.8.4.1_0 restclient resteasy http post get chrome插件离线安装方法请访问:http://www.bywei.cn/ www.jiaivr.com www.ctrip356.com 或者加我的QQ:240349846