開發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項目。
- Spring3 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