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 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374904.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

appcmd命令導入導出站點與應用程序池

在IIS7上導出所有應用程序池的方法: %windir%\system32\inetsrv\appcmd list apppool /config /xml > c:\apppools.xml 這個命令會將服務器上全部的應用程序池都導出來,但有些我們是我們不需要的,要將他們刪掉.比如: DefaultAppPoolClassic .Net AppPool如果在導入時發現同名…

卸載apache

1、運行services.msc&#xff0c;在服務中停止 apache 服務。2、運行命令行程序&#xff0c;輸入 sc delete apache&#xff0c;刪除該服務3、刪除apache文件夾。轉載于:https://www.cnblogs.com/jiangjieqim/p/5357950.html

使用wowza和xuggler將RTMP轉換為RTSP

注意&#xff1a;這是我們的“ Xuggler開發教程 ”系列的一部分。 大家好&#xff01; 在過去的三個月中&#xff0c;我們一直在進行電話會議項目。 我們認為&#xff0c;使用諸如Flex之類的技術的基于Web的應用程序將是此類要求苛刻的項目的最佳方法。 隨著軟件的復雜性和電信…

如何設置網頁標題圖標

1、先制作一個名為favicon.ico的小圖標&#xff0c;并將其放到網站根目錄下 2、在html頁面<head></head>標簽內加入&#xff1a; <link rel"shortcut icon" href"favicon.ico" />OK轉載于:https://www.cnblogs.com/moshengr/p/4600281.h…

C語言pow函數的精度問題

&#xff08;1&#xff09;pow函數返回值是double類型 &#xff08;2&#xff09;pow原型 double pow(double x,double y); (3)sqrt原型 double sqrt(double x); 當輸出時函數值賦給整型就會出錯&#xff1a; int main()d {int N 1;scanf("%d",&N);for(int i …

習題2-1 求整數均值 (10 分)

吐槽一下&#xff0c;因為少打了一個空格&#xff0c;PTA上老是不給我過&#xff0c;還一直報結果錯誤&#xff0c;誤導我好久&#xff0c;即使是吹毛求疵&#xff0c;也應該提示我格式錯誤吧&#xff01;&#xff01; 原題&#xff1a; 本題要求編寫程序&#xff0c;計算4個整…

iframe高度自適應,終于解決了

一直被iframe的高度自適應的問題困擾著&#xff0c;在項目中也是多次遇到。網上也有不少相關的代碼&#xff0c;但是總不能滿足自己的要求。在頭痛了幾次之后終于下定決心解決這個問題。 本代碼主要解決的問題是&#xff1a;最外層滾動條隨著iframe高度動態變化的問題。如果ifr…

在領域驅動的設計,貧乏的領域模型,代碼生成,依賴項注入等方面……

埃里克埃文斯&#xff08;Eric Evans&#xff09;已制定了什么是域驅動設計&#xff08;DDD&#xff09;。 Martin Fowler是DDD的大力支持者和擁護者。 這些都是非凡的名字&#xff0c;幾乎可以肯定的是&#xff0c;他們正在支持一些有價值的東西。 我不是在這里對此爭論。 也許…

Javascript模塊化工具require.js教程

轉自&#xff1a;http://www.w3cschool.cc/w3cnote/requirejs-tutorial-1.html, http://www.w3cschool.cc/w3cnote/requirejs-tutorial-2.html 隨著網站功能逐漸豐富&#xff0c;網頁中的js也變得越來越復雜和臃腫&#xff0c;原有通過script標簽來導入一個個的js文件這種方式已…

數據值、列類型和數據字段屬性

數據值&#xff1a;數值型、字符型、日期型和空值等。數據列類型 2.1 數值類的數據列類型2.2 字符串類數據列類型 2.3 日期和時間型數據數據列類型 另外&#xff0c;也可以使用整形列類型存儲UNIX時間戳&#xff0c;代替日期和時間列類型&#xff0c;這是基于PHP的web項目中常…

全文搜索Apache Lucene簡介

在本教程中&#xff0c;我想談談Apache Lucene 。 Lucene是一個開源項目&#xff0c;提供基于Java的索引和搜索技術。 使用其API&#xff0c;很容易實現全文搜索 。 我將處理Lucene Java版本 &#xff0c;但請記住&#xff0c;還有一個名為Lucene.NET的.NET端口&#xff0c;以及…

函數scanf

本節介紹輸入函數 scanf 的用法。scanf 和 printf 一樣&#xff0c;非常重要&#xff0c;而且用得非常多&#xff0c;所以一定要掌握。 概述 scanf 的功能用一句話來概括就是“通過鍵盤給程序中的變量賦值”。該函數的原型為&#xff1a; # include <stdio.h> int scanf(…

C語言中定義變量位置

C標準的問題 C89規定&#xff0c;在任何執行語句之前&#xff0c;在塊的開頭聲明所有局部變量。 即應該如下&#xff1a;定義變量只能在最開始&#xff0c;scanf等執行語句之前 int N 0;double sum 0;scanf("%d",&N);在C99以及C中則沒有這個限制&#xff0c;即…

Java中的低GC:使用原語而不是包裝器

總覽 有兩個很好的理由在可能的地方使用原語而不是包裝器。 明晰。 通過使用原語&#xff0c;您可以清楚地知道null值是不合適的。 性能。 使用原語通常更快。 清晰度通常比性能更重要&#xff0c;并且是使用它們的最佳理由。 但是&#xff0c;本文討論了使用包裝程序對性能…

C# 連接Oracle數據庫以及一些簡單的操作

拖了很久今天終于在博客園寫了自己第一篇隨筆&#xff1a; 話不多說&#xff0c;我們直接進入正題&#xff1a; 1.連接數據庫 using (OracleConnection conn new OracleConnection("data source192.168.97.60/orcl;User Idabc;Passwordabc;")) { …

markdownb編輯器

這是H1 這是H2 這是H3 這是一個標題。 這是第一行列表項。這是第二行列表項。給出一些例子代碼&#xff1a; return shell_exec("echo $input | $markdown_script"); 轉載于:https://www.cnblogs.com/xcl461330197/p/4605163.html

Java Secret:使用枚舉構建狀態機

總覽 Java中的枚舉比許多其他語言更強大&#xff0c;這可能導致令人驚訝的用途。 在本文中&#xff0c;我概述了Java 枚舉的一些單獨功能&#xff0c;并將它們組合在一起形成一個狀態機。 單例和實用程序類的枚舉 您可以非常簡單地將枚舉用作Singleton或Utility。 enum Si…

數組部分筆記

對于數組的初始化需要注意以下幾點&#xff1a; 可以只給部分元素賦值。當{ }中值的個數少于元素個數時&#xff0c;只給前面部分元素賦值。例如&#xff1a; int a[10]{12, 19, 22 , 993, 344};表示只給 a[0]~a[4] 5個元素賦值&#xff0c;而后面 5 個元素自動初始化為 0。 …

指向函數的指針

指向函數的指針變量的一般形式為&#xff1a;數據類型 &#xff08;*指針變量名&#xff09;&#xff08;函數參數表列&#xff09;&#xff1b;如&#xff1a; int (*p)(int ,int );1、int (*p)(int ,int );表示定義一個指向函數的指針變量p&#xff0c;它不是固定只能指向…

核心Java面試答案不正確

總覽 在Internet上&#xff0c;Java面試問題和答案從一個網站復制到另一個網站。 這可能意味著錯誤或過時的答案可能永遠不會得到糾正。 這是一些不太正確或已經過時的問題和答案。 即是Java 5.0之前的版本。 每個提供的問題后都有兩個部分。 斜體的第一部分指示答案不完整/錯…