resteasy_Tomcat 7上具有RESTeasy JAX-RS的RESTful Web服务– Eclipse和Maven项目

resteasy

开发Web服务的RESTful方法不断受到越来越多的关注,并且似乎正在将SOAP淘汰。 我不会讨论哪种方法更好,但是我相信我们都同意REST更轻量级。 在本教程中,我将向您展示如何使用RESTeasy开发RESTful服务以及如何将它们部署在Tomcat服务器上。 在此过程中还将创建一个基于Eclipse的Maven项目。

我最近想测试计划用于正在构建的应用程序中的REST客户端,因此我需要一种快速的方法来建立RESTful基础结构。 贾斯汀就如何使用Spring提供RESTful服务撰写了一篇很棒的指南。 但是,我想要更快的东西,并且不要一次与Spring混为一谈。 因此,我决定使用JBoss RESTeasy 。 从官方网站:

RESTEasy是一个JBoss项目,它提供各种框架来帮助您构建RESTful Web服务和RESTful Java应用程序。 它是JAX-RS规范的完全认证且可移植的实现。 JAX-RS是新的JCP规范,它通过HTTP协议为RESTful Web服务提供Java API。
RESTEasy可以在任何Servlet容器中运行,但是还可以与JBoss Application Server进行更紧密的集成,以使用户在该环境中获得更好的体验。

可以在这里找到最新的RESTeasy版本,并在这里找到相关文档。 目前,最新版本是2.1.0.GA。 您可能还需要RESTeasy JavaDoc和JAX-RS JavaDoc 。

由于使用JBoss AS会取消整个“轻量级”概念,因此我决定与我们的老朋友Tomcat一起使用。 我从这里下载了最受欢迎的servlet容器的最新版本(7.0.5 beta)。 请注意,目前这还处于beta阶段,但是Tomcat已经被证明非常强大,我认为应该不会出现任何问题。

首先创建一个名为“ RESTeasyProject”的基于Eclipse的Maven项目。 所使用的原型为“ webapp-jee5”,如下图所示:

对于参数,我们将“ com.javacodegeeks”用作组ID,将“ resteasy”用作工件ID。

下一步是在我们的pom.xml文件中添加RESTeasy依赖项。 存储库URL是http://repository.jboss.org/maven2/,但是不幸的是,该存储库中提供的最新版本是2.0-beta-2。 无论如何,我们需要添加到Maven文件中的行是:

…
<repositories><repository><id>org.jboss.resteasy</id><url>http://repository.jboss.org/maven2/</url></repository>
</repositories>
…
<dependencies>
…
<dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-jaxrs</artifactId><version>2.0-beta-2</version>
</dependency>
<dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-jaxb-provider</artifactId><version>2.0-beta-2</version>
</dependency>
<dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-jettison-provider</artifactId><version>2.0-beta-2</version>
</dependency>
…
</dependencies>
…

resteasy-jaxrs构件引用了JAX-RS实现的核心RESTeasy类。 另外,我们同时使用resteasy-jaxb-provider和resteasy-jettison-provider,因为我们希望同时支持XML和JSON响应格式。 JAXB体系结构用于XML序列化,而Jettison框架用于编写JSON。

这是完整的pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.javacodegeeks</groupId><artifactId>resteasy</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>resteasy JEE5 Webapp</name><url>http://maven.apache.org</url><repositories><repository><id>org.jboss.resteasy</id><url>http://repository.jboss.org/maven2/</url></repository></repositories><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-jaxrs</artifactId><version>2.0-beta-2</version></dependency><dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-jaxb-provider</artifactId><version>2.0-beta-2</version></dependency><dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-jettison-provider</artifactId><version>2.0-beta-2</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.0.2</version><configuration><source>1.5</source><target>1.5</target></configuration></plugin></plugins><finalName>resteasy</finalName></build>
</project>

我们首先来看一下将在我们的服务中使用的模型类:

package com.javacodegeeks.resteasy.model;import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name = "employee")
public class Employee {private String employeeId;private String employeeName;private String job;@XmlElementpublic String getEmployeeId() {return employeeId;}public void setEmployeeId(String employeeId) {this.employeeId = employeeId;}@XmlElementpublic String getEmployeeName() {return employeeName;}public void setEmployeeName(String employeeName) {this.employeeName = employeeName;}@XmlElementpublic String getJob() {return job;}public void setJob(String job) {this.job = job;}}

典型的模型类,其中包含一些字段以及相应的获取器/设置器。 使用JAXB批注以指示要序列化哪些字段以及将它们映射到哪些元素。 更具体地说,使用XmlRootElement批注来指示顶级类元素。 类似地,使用XmlElement注释获取器,以将相应的JavaBean属性映射到XML元素。 默认情况下,使用属性名称,但是我们可以通过提供一个自定义名称来覆盖它。

现在让我们创建第一个启用RESTeasy的类,名为“ SampleService”。

package com.javacodegeeks.resteasy;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;import com.javacodegeeks.resteasy.model.Employee;@Path("/sampleservice")
public class SampleService {private static Map<String, Employee> employees = new HashMap<String, Employee>();static {Employee employee1 = new Employee();employee1.setEmployeeId("1");employee1.setEmployeeName("Fabrizio");employee1.setJob("Software Engineer");employees.put(employee1.getEmployeeId(), employee1);Employee employee2 = new Employee();employee2.setEmployeeId("2");employee2.setEmployeeName("Justin");employee2.setJob("Business Analyst");employees.put(employee2.getEmployeeId(), employee2);}@GET@Path("/hello")@Produces("text/plain")public String hello(){return "Hello World";    }@GET@Path("/echo/{message}")@Produces("text/plain")public String echo(@PathParam("message")String message){return message;    }@GET@Path("/employees")@Produces("application/xml")public List<Employee> listEmployees(){return new ArrayList<Employee>(employees.values());}@GET@Path("/employee/{employeeid}")@Produces("application/xml")public Employee getEmployee(@PathParam("employeeid")String employeeId){return employees.get(employeeId);        }@GET@Path("/json/employees/")@Produces("application/json")public List<Employee> listEmployeesJSON(){return new ArrayList<Employee>(employees.values());}@GET@Path("/json/employee/{employeeid}")@Produces("application/json")public Employee getEmployeeJSON(@PathParam("employeeid")String employeeId){return employees.get(employeeId);        }}

如您所见,我们的服务有很多注释。 我们可以声明性地定义每个方法都会响应的HTTP方法,例如GET或POST 。 对于提供资源的URL,我们在服务和方法级别都使用PATH 。 如果方法接受参数或属于特定路径段, 则以PathParam表示。 最后, Consumes批注定义资源方法可以接受的媒体类型,而Produces定义可以生成的类型。

让我们研究更多细节。 我们将一些模拟数据存储在静态映射上,在实际的应用程序上将由DAO代替。 请注意,模型类将由库针对XML和JSON表示进行序列化。 现在让我们看一下暴露的方法:

  • hello :一种仅打印具有文本/纯内容类型的预定义字符串的方法。
  • echo :此方法返回提供的任何参数。 请注意,方括号内的字段名称必须与参数名称匹配。 与上面类似的内容类型。
  • listEmployees :此方法提供模型对象列表的XML表示。 格式由Produces注释指示。
  • getEmployee :与上一个相同,但根据ID参数仅返回一个模型对象。
  • listEmployeesJSON :与XML相似,但产生的格式为JSON。
  • getEmployeeJSON :与上一个相同,但仅基于ID参数返回一个模型对象。

接下来,我们必须相应地设置Web应用程序的web.xml文件,以便RESTeasy处理传入的REST请求。 在我们的Maven项目中,可以在“ src / main / webapp / WEB-INF”目录下找到该文件。 声明文件如下所示:

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name>resteasy</display-name><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>/restful-services/*</url-pattern></servlet-mapping><context-param><param-name>resteasy.scan</param-name><param-value>true</param-value>    </context-param><context-param><param-name>resteasy.servlet.mapping.prefix</param-name><param-value>/restful-services</param-value></context-param></web-app>

为了使用resteasy创建注册表,必须部署ResteasyBootstrap上下文侦听器,同时使用HttpServletDispatcher Servlet,以便将传入请求正确路由到适当的服务。 我们已经配置了名为“ Resteasy”的特定servlet,以拦截“ / restful-services / *”路径下的请求。 我们需要使用resteasy.servlet.mapping.prefix配置选项将其定义为RESTeasy框架。 请注意,该值不包含尾部斜杠或通配符。 最后,我们使用resteasy.scan开关自动扫描WEB-INF / lib jar和WEB-INF / classes目录中的各种带注释的类。 您还可以使用许多其他RESTeasy配置开关来微调应用程序的行为。

最后一步是构建项目并将其部署到servler容器。 运行Eclipse配置,然后选择“ Maven安装”。 假设一切正常,这将在项目的“目标”文件夹下生成一个名为“ resteasy.war”的网络存档。 也可以在同一目录中找到展开的文件夹。 将WAR文件复制到Tomcat的应用程序存储库,即“ apache-tomcat-7.0.5 \ webapps”文件夹。 如果尚未启动服务器,请启动控制台,并且应该在控制台上看到以下行:

添加扫描的资源:com.javacodegeeks.resteasy.SampleService

现在已经部署了应用程序,让我们对其进行测试。 请注意,由于所有方法都处理GET请求,因此可以使用您喜欢的浏览器并仅编写URL来执行测试。 对于懒惰的开发人员,它们在这里(在XML和JSON的情况下,我还添加了具有预期结果的公共链接):

http:// localhost:8080 / resteasy / restful-services / sampleservice / hello

http:// localhost:8080 / resteasy / restful-services / sampleservice / echo / message

http:// localhost:8080 / resteasy / restful-services / sampleservice / employees ( 链接 )

http:// localhost:8080 / resteasy / restful-services / sampleservice / employee / 1 ( 链接 )
http:// localhost:8080 / resteasy / restful-services / sampleservice / json / employees ( 链接 )
http:// localhost:8080 / resteasy / restful-services / sampleservice / json / employee / 1 ( 链接 )

请注意,完整路径包括Web应用程序上下文(“ resteasy”),我们定义的RESTeasy处理上下文(“ restful-services”),服务路径(“ sampleservice”)以及相应的方法路径。

仅此而已。 与往常一样,您可以在此处找到Eclipse项目。

相关文章 :
  • Spring 3 RESTful Web服务
  • 具有Spring和Maven教程的JAX–WS
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示
  • GWT Spring和Hibernate进入数据网格世界
  • 使用Spring使用Java发送电子邮件– GMail SMTP服务器示例

翻译自: https://www.javacodegeeks.com/2011/01/restful-web-services-with-resteasy-jax.html

resteasy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java httpserver 多个接口_多个Servlet之间数据共享实现方案

1.数据共享&#xff1a;OneServlet工作完毕后&#xff0c;将产生数据交给TwoServlet来使用Servlet规范中提供四种数据共享方案1.ServletContext接口2.Cookie类3.HttpSession接口4.HttpServletRequest接口ServletContext接口:1.介绍&#xff1a;1)来自于Servlet规范中一个接口。…

【Java心得总结六】Java容器中——Collection

在【Java心得总结五】Java容器上——容器初探这篇博文中&#xff0c;我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库。而在这篇博文中&#xff0c;我想着重对容器类库中的Collection容器做一个着重的探索与总结。 Collection&#xff1a;一个独立元素的序…

php 文章读取_php实现获取文章内容第一张图片的方法

本文实例讲述了php实现获取文章内容第一张图片的方法。分享给大家供大家参考。具体分析如下&#xff1a;采用php获取文章内容的第一张图片方法非常的简单&#xff0c;我们最常用的是使用正则了&#xff0c;感兴趣的朋友可以参考一下下面这段代码。以下是关于选取文章中第一张图…

相对路径

当前程序的所在目录textBox1.Text AppDomain.CurrentDomain.BaseDirectory; 返回D:\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\http://www.cnblogs.com/SissyNong/archive/2009/09/22/1571752.html 当前程序的完整路径textBox1.Text System.Diagnostics.…

php怎么传json数据_php和js如何通过json互相传递数据相关问题探讨

当我们在结合php和javascript实现某些功能时&#xff0c;经常会用到json。json是js的一种数据格式&#xff0c;可以直接被js解析。而php无法直接读取json数据&#xff0c;但是php提供了json_decode函数来对json数据进行转化&#xff0c;从而可以被php脚本访问。同时&#xff0c…

Java 8中的策略模式

这是两个有关如何使用Java 8功能样式以及Cyclops模式匹配和Hamcrest库来实现策略模式设计的示例。 PrintDependingOnInput方法是一种策略&#xff0c;该策略将根据传递的日志在System.println中显示一些消息。 AddPrefix是另一种策略&#xff0c;它将根据邮件内容为邮件添加前…

昨天帮同学的学校写了首校歌

转载于:https://www.cnblogs.com/del/p/3792526.html

php做一个微信退款,PHP实现微信申请退款流程实例代码

前面讲了怎么实现微信支付&#xff0c;详见博文&#xff1a;php实现微信支付(jsapi支付)流程 和ThinkPHP中实现微信支付(jsapi支付)流程。由于业务需求&#xff0c;还需要有微信退款&#xff0c;经过研究和摸索&#xff0c;也终于搞定了。前期准备&#xff1a;当然是搞定了微信…

gwt格式_使用Spring Security保护GWT应用程序的安全

gwt格式在本教程中&#xff0c;我们将看到如何将GWT与Spring的安全模块&#xff08;即Spring Security&#xff09;集成。 我们将看到如何保护GWT入口点&#xff0c;如何检索用户的凭据以及如何记录各种身份验证事件。 此外&#xff0c;我们将实现自定义身份验证提供程序&#…

php制图汉字,PHP用imageTtfText函数在图片上写入汉字

PHP绘图&#xff0c;imageString()这个函数并不支持汉字的绘制。这往往会给入门者当头一棒&#xff0c;不过不要着急&#xff0c;因为还有一个imageTtfText()函数&#xff0c;这个函数能绘制UTF-8编码的字符串&#xff0c;当然可以绘制汉字了。参数&#xff1a;$size 字体大小&…

K-Means算法Demo

简介&#xff1a;本Demo是参照这个网站上的Demo自己用Java实现的。将Java打包为Jar&#xff0c;再将Jar转为exe&#xff0c;源代码及程序Demo下载请点我。 K-Means算法简介 我尽量用通俗易懂但不规范的语言来描述K-Means算法。 K-Means算法是数据挖掘十大算法之一&#xff0c;是…

php 时间周期,php 的生命周期

1、PHP的运行模式&#xff1a;PHP两种运行模式是WEB模式、CLI模式。无论哪种模式&#xff0c;PHP工作原理都是一样的&#xff0c;作为一种SAPI运行。1、当我们在终端敲入php这个命令的时候&#xff0c;它使用的是CLI。它就像一个web服务器一样来支持php完成这个请求&#xff0c…

领域驱动设计之领域模型_在领域驱动的设计,贫乏的领域模型,代码生成,依赖项注入等方面……...

领域驱动设计之领域模型埃里克埃文斯&#xff08;Eric Evans&#xff09;已制定了域驱动设计&#xff08;DDD&#xff09;。 Martin Fowler是DDD的大力支持者和拥护者。 这些都是非凡的名字&#xff0c;几乎可以肯定的是&#xff0c;他们正在支持一些有价值的东西。 我不是在这…

struts2与struts1整合,java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

原因&#xff1a;我往项目的WEB-INF/lib中导入了struts2基本的包&#xff0c;还有struts1的core包&#xff0c;以及struts2-strut1-plugin的包&#xff0c;但是没有导入commons-loggin-1.3.1这个包&#xff0c;如下图 我打开commons-loggin-1.3.1这个包看了一下&#xff0c;果然…

debian 查看php版本,Debian 下轻松实现 PHP 多版本共存

PHP7 的发布废弃了部分特性&#xff0c;一些程序或者插件当前不能很好的运行在 PHP7 上&#xff0c;因此如果服务器上能同时运行多个 PHP 的版本&#xff0c;就可以很好的解决过渡期的兼容性问题。在前面两篇文章中&#xff0c;我们介绍了如何在 Debian Stretch 中安装使用 PHP…

query和prototype库冲突的解决方法

我们在使用 jQuery 的过程中我们会频繁使用 $ 符号&#xff0c;$是JQuery的别名&#xff0c;所有使用$的地方也都可以使用JQuery来替换&#xff0c;例如 如$(#msg)等同于JQuery(#msg)的写法。 在页面中同时引入另一个js类库&#xff0c;并且该类库也是用了 $ 符号时&#xff0c…

php启用openssl,php开启openssl的方法

php开启openssl的方法&#xff0c;大多数情况下openssl是没有开启的&#xff0c;要想启用需要进行下简单的设置windows下开启方法&#xff1a;1&#xff1a; 首先检查php.ini中&#xff1b;extensionphp_openssl.dll是否存在&#xff0c; 如果存在的话去掉前面的注释符‘&#…

apache lucene_全文搜索Apache Lucene简介

apache lucene在本教程中&#xff0c;我想谈谈Apache Lucene 。 Lucene是一个开源项目&#xff0c;提供基于Java的索引和搜索技术。 使用其API&#xff0c;很容易实现全文搜索 。 我将处理Lucene Java版本 &#xff0c;但请记住&#xff0c;还有一个名为Lucene.NET的.NET端口&a…

php 运算验证码类,php 数学运算验证码实现代码

//-------------------------------------// 文件说明&#xff1a;数学运算验证码// 文件作者&#xff1a;Jesse Lee// 最后更新&#xff1a;2008-09-07//-------------------------------------session_start();$sessionvar vdcode; //Session变量名称$width 150; //图像宽度…

经典ICP算法的问题

最近可能要用三维点云实现一个三维场景重建的功能&#xff0c;从经典的ICP算法开始&#xff0c;啃了一些文档&#xff0c;对其原理也是一知半解。 迭代最近点算法综述 大致参考了这份文档之后&#xff0c;照流程用MATLAB实现了一个简单的ICP算法&#xff0c;首先是发现这份文档…