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

开发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 JavaDocJAX-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;
    
    @XmlElement
    public String getEmployeeId() {
        return employeeId;
    }
    
    public void setEmployeeId(String employeeId) {
        this.employeeId = employeeId;
    }
    
    @XmlElement
    public String getEmployeeName() {
        return employeeName;
    }
    
    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }
    
    @XmlElement
    public 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方法,例如GETPOST 。 对于提供资源的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项目。

相关文章 :

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值