Google App Engine JAX-RS REST服務

在本文中,您將學習如何使用JAX-RS參考實現(Jersey)創建REST服務并將其部署在Google AppEngine上。

先決條件
對于本教程,您將需要:
  • Google AppEngine帳戶
  • Eclipse Galileo(3.5.x)
  • 適用于Java的Google App Engine SDK
    • 按照此處所述安裝Eclipse的Google插件(檢查您是否正在使用GAE Java SDK的1.3.1版,如果未下載,請配置該插件以使用它)
    • 在本地擁有AppEngine文檔也很有用,您可以從此處下載。
  • JAX-RS參考實現,請確保您采用Jersey 1.1.5版本。 您可以從這里下載。
    • 將文件解壓縮到我們稱為$ JERSEY_HOME的目錄中
  • JAXB 2.2實現可簡化XML的編組/解組,并簡化JSON支持。 從這里下載
    • 使用java -jar JAXB2_20091104.jar命令安裝它。 JAXB的安裝目錄將稱為$ JAXB_HOME

創建新的應用程序

要在Eclipse中創建新的App Engine項目,請執行以下操作:

  1. 單擊“新的Web應用程序項目”按鈕 在工具欄中。 也可以使用菜單文件> Web應用程序項目來執行此操作
  2. 將打開“創建Web應用程序項目”向導:
  • 項目名稱:EmployeeService
  • 打包:com.grallandco.employee.service
  • 取消選中“使用Google Web Toolkit”
  • 檢查您使用的SDK版本是否為“ App Engine 1.3.0”; 如果沒有配置項目以使用它。
  • 該屏幕應類似于以下屏幕:
  • 點擊完成
  • 該項目應類似于以下屏幕:

運行應用程序

隨Eclipse插件一起安裝的App Egine SDK包含一個Web服務器(基于Jetty),可用于測試和調試。 要測試是否已正確創建應用程序,請選擇菜單運行>運行方式> Web應用程序。 我大部分時間都使用調試命令運行>調試> Web應用程序運行服務器。 在調試模式下,您可以更改源代碼,并且無需重新啟動服務器即可進行測試。

Web服務器自動啟動,您應該在Eclipse控制臺中看到以下消息

服務器正在http:// localhost:8080 /上運行

您可以訪問該應用程序以及使用以下URL創建的樣本servlet:http:// localhost:8080 / employeeservice

要停止服務器,請單擊終止按鈕 在Eclipse控制臺中。

在應用程序中配置REST支持

為了能夠在您的應用程序中創建和運行REST服務,您需要:

  • 在您的項目和應用程序中添加JAX-RS,JAXB Jars
  • 配置Web應用程序(web.xml)以處理REST請求

將JAX-RS,JAXB添加到您的項目

  1. 右鍵單擊項目,然后選擇菜單項Build Path> Configure Build Path…。
  2. 單擊添加外部JAR按鈕
  3. 選擇$ JERSEY_HOME / lib和$ JAXB_HOME / lib文件夾中的所有JAR。 您可以更好地了解和重用所有這些JAR創建用戶庫
  4. 您還需要復制應用程序的web-inf / lib目錄中的JAR,此步驟是強制性的,以確保將JAR部署到App Engine時包含在應用程序中。
    注意:我不喜歡此步驟。 我希望通過配置構建路徑來執行此操作,以便在執行/部署應用程序時將JAR自動添加到WEB-INF / lib目錄中。 不幸的是,我沒有找到方法,所以,如果您知道它,請隨時發表評論,我將更新本文。

配置Web應用程序

在此步驟中,您將注冊一個新的URI以處理REST請求。 為此,您需要注冊一個使用Jersey API的新servlet,并將其配置為特定的URI(例如:/ ressources和/或/ rest),并配置包含REST實現類的Java軟件包。 因此,您需要使用以下條目修改應用程序的web.xml:

<servlet><servlet-name>Jersey Web Application</servlet-name><servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class><init-param><param-name>com.sun.jersey.config.property.packages</param-name><param-value>com.grallandco.employee.service.rest.impl</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>Jersey Web Application</servlet-name><url-pattern>/resources/*</url-pattern></servlet-mapping><servlet-mapping><servlet-name>Jersey Web Application</servlet-name><url-pattern>/rest/*</url-pattern></servlet-mapping>
該servlet將響應/ resources /和/ rest / URL。 澤西使用配置參數com.sun.jersey.config.property.packages列出REST服務實現所在的軟件包。請注意,您可以根據需要放置任意數量的軟件包,只需分隔軟件包名稱即可。由一個;

創建一個簡單的REST服務以測試環境

現在,該項目已準備好包含REST服務。 現在是時候創建一個了。例如,創建類com.grallandco.employee.service.rest.impl.HelloWorldResource,請確保使用在web.xml中為Jersey servlet配置的包名稱。我們在上一步中進行的配置是com.grallandco.employee.service.rest.impl

這里是帶有JAX-RS批注的示例類:

package com.grallandco.employee.service.rest.impl;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
@Path("/hr/")
public class EmployeeResource {@GET@Produces("text/plain")@Path("/employee") public String getEmployee() {return "Hello World!";}
}

您應該能夠對其進行測試,停止服務器并再次運行它,然后在瀏覽器中輸入以下URL:
http:// localhost:8080 / resources / hr / employee
要么 http:// localhost:8080 / rest / hr / employee

將應用程序部署到Google App Engine

在部署應用程序之前,您需要使用Administartion控制臺在Google App Engine中注冊新應用程序,請參閱此處的文檔。 在我的示例中,我使用“ tugdual”作為應用程序ID。

現在,您可以通過單擊Eclipse工具欄中的“部署App Engine項目”按鈕輕松地將應用程序部署到Google App Engine。

為了能夠將您的應用程序部署到Google App Engine,您需要檢查您的應用程序是否可以注冊,該應用程序ID存儲在WEB-INF / lib / appengine-web.xml中。

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"><application>[your-application-id]</application>   <version>1</version>    <!-- Configure java.util.logging --><system-properties><property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/></system-properties>    
</appengine-web-app>

App Engine部署按鈕會提示您輸入多個信息:用戶名(您的Google帳戶)和密碼。

部署完成后,您可以使用以下URL訪問您的應用程序:
http:// [your-application-id] .appspot.com / resources / hr / employee
要么 http:// [your-application-id] .appspot.com / rest / hr / employee

將XML和JSON支持到服務

現在,讓我們添加新的方法來使用服務來操作“ Employee”對象,并且數據格式應基于JSON和XML。 這是JAXB有用的地方,因為它可以輕松地以XML(顯然)和JSON轉換marshall / unmarshall Java對象,這很酷!

創建員工類

從創建一個用于處理Employee數據的新類開始,這是一個非常簡單的Java類,可能類似于以下代碼:

package com.grallandco.employee.service.model;
import java.util.Date;public class Employee {private String firstName;private String lastName;private Date hireDate;private String email;   public Employee(String firstName, String lastName, Date hireDate, String email) {this.firstName = firstName;this.lastName = lastName;this.hireDate = hireDate;this.email = email;}public Employee() {}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public Date getHireDate() {return hireDate;}public void setHireDate(Date hireDate) {this.hireDate = hireDate;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String toString() {StringBuffer sb = new StringBuffer();sb.append("First: ").append(getFirstName());sb.append(" - Last: ").append(getLastName());sb.append(" - Date: ").append(getHireDate());sb.append(" - Email: ").append(getEmail());return sb.toString();}
}

當使用某個持久層實現“真實”應用程序時,此POJO是作為JDO / JPA實體的一個。

為您的實體創建一個Converter類

我通常將所有轉換封裝在某個轉換器類中,就像這樣,我沒有將業務類直接耦合到序列化機制。 (因此,我對類和類列表進行了此操作)。 因此,我們不要將JAXB批注添加到Employee類本身,而是創建一個EmployeeConverter類,該類負責轉換并由REST服務使用。

package com.grallandco.employee.service.converter;import java.util.Date;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import com.grallandco.employee.service.model.Employee;@XmlRootElement(name = "employee")
public class EmployeeConverter {private Employee entity = null;public EmployeeConverter() {entity = new Employee();}public EmployeeConverter(Employee entity) {this.entity = entity;}@XmlElementpublic String getFirstName() {return entity.getFirstName();}@XmlElementpublic String getLastName() {return entity.getLastName();}@XmlElementpublic Date getHireDate() {return entity.getHireDate();}@XmlElementpublic String getEmail() {return entity.getEmail();}public Employee getEmployee() {return entity;}public void setFirstName(String firstName) {entity.setFirstName(firstName);}public void setHireDate(Date hireDate) {entity.setHireDate(hireDate);}public void setLastName(String email) {entity.setEmail(email);}public void setEmail(String lastName) {entity.setLastName(lastName);}
}

現在,您可以更新服務,以使用此實用程序/轉換器類根據請求的內容類型返回XML或JSON對象。

將JSON和XML支持添加到REST服務

您需要更改EmployeeRessource類,更改簽名并添加getEmployee()方法的新注釋。
您要添加的注釋:

  • @Produces({“ application / xml”,“ application / json”}):指示服務將產生哪種類型的內容。 基于請求的類型。
  • @Path(“ / employee / {employeeEmail} /”):更改Path以指示Path參數,例如,URL可以接受URI中的電子郵件-不是最佳示例,但是您明白了……
  • public EmployeeConverter getEmployee(@PathParam(“ employeeEmail”)字符串電子郵件):更改方法返回的類型,并采用與@Path批注中定義的Path參數相匹配的參數String。

這里是完整的類代碼:

package com.grallandco.employee.service.rest.impl;import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import com.grallandco.employee.service.converter.EmployeeConverter;
import com.grallandco.employee.service.model.Employee;@Path("/hr/")
public class EmployeeRessource {@GET@Produces({"application/xml", "application/json"})@Path("/employee/{employeeEmail}/") public EmployeeConverter getEmployee( @PathParam ("employeeEmail") String email) {//dummy codeEmployee emp = new Employee();emp.setEmail(email);emp.setFirstName("John");emp.setLastName("Doe");EmployeeConverter converter = new EmployeeConverter(emp);return converter;} 
}

測試服務

您現在可以在本地運行服務器并測試服務
http:// localhost:8080/resources/hr/employee/tug@grallandco.com
這將返回一個XML文檔。 如果要測試JSON調用,則有多種選擇:

  • 使用以下命令
tgrall$ curl -H "Accept: application/json" http://localhost:8080/resources/hr/employee/tug@grallandco.com
{"email":"tug@grallandco.com","firstName":"John","lastName":"Doe"}
  • 我使用的是HTTP客戶端,它允許您完全配置/設置HTTP請求,而我使用的是Poster Firefox插件
  • 在應用程序中使用一些Javascript代碼

您可以在Google App Engine上對已部署的應用程序重復測試。

結論

在本文中,您學習了如何在Google App Engine上創建和部署新的REST服務。 該服務是通過“ JAX-RS參考實施澤西”項目創建的。 在下一篇文章中,您將學習如何在Google App Engine上添加持久性和創建CRUD Rest服務。

參考: Tug博客博客上的JCG合作伙伴 Tugdual Grall在Google App Engine上創建和部署JAX-RS REST服務 。


翻譯自: https://www.javacodegeeks.com/2012/05/google-app-engine-jax-rs-rest-service.html

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

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

相關文章

libnids校驗和引起回放包不能正常捕捉

如題 取消校驗和校驗即可&#xff1a; struct nids_chksum_ctl temp;temp.netaddr 0;temp.mask 0;temp.action 1;nids_register_chksum_ctl(&temp,1); 在init之前。轉載于:https://www.cnblogs.com/yaoyuanfeixing/p/6308067.html

鴻蒙系統的全面開源,華為:打造全球的操作系統,鴻蒙今日全面開源!

原標題&#xff1a;華為&#xff1a;打造全球的操作系統&#xff0c;鴻蒙今日全面開源&#xff01;今日下午&#xff0c;2019華為全球開發者大會在華為松山湖基地正式開幕。華為正式對外推出了自研操作系統——鴻蒙系統(Harmony OS)。華為消費者業務CEO余承東指出&#xff0c;鴻…

android 獲取路徑目錄方法以及判斷目錄是否存在,創建目錄

Environment 常用方法&#xff1a; * 方法&#xff1a;getDataDirectory()解釋&#xff1a;返回 File &#xff0c;獲取 Android 數據目錄。* 方法&#xff1a;getDownloadCacheDirectory()解釋&#xff1a;返回 File &#xff0c;獲取 Android 下載/緩存內容目錄。* 方法&…

Maven不會吮吸。 。 。 但是Maven文件會

我不會參加整個Maven辯論&#xff0c;但是可以說我是所有最佳實踐的有力支持者&#xff0c;對我而言&#xff0c;Maven是最佳實踐的體現。 我的意思是說&#xff0c;Maven是圍繞特定的最佳實踐構建方法構建的。 注意&#xff0c;我說了一種特定的最佳實踐構建方法。 在現實世界…

html5 游戲制作教程,html5一步步實現超級瑪麗游戲制作(新手教程源碼)

【實例簡介】【實例截圖】【核心代碼】My first Gamebody {border:none 0px;margin:0px;padding:10px;font-size : 16px;background-color : #f3f3f3;}canvas {border : 1px solid blue;}// 頁面初始化函數function init(){//加載圖片,并存入全局變量 ImgCache,// 加載完成后,調…

同步與異步的概念

進程同步用來實現程序并發執行時候的可再現性。 一&#xff0e;進程同步及異步的概念 1&#xff0e;進程同步&#xff1a;就是在發出一個功能調用時&#xff0c;在沒有得到結果之前&#xff0c;該調用就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事.就像早上起…

編寫Play 2的模塊,第1部分:使工作正常

幾周前&#xff0c;我遷移了Play&#xff01; 框架 1.x版本的Deadbolt應用于Play 2平臺&#xff0c;并且對缺少有關創建模塊的信息感到驚訝。 Play 1.x文檔中詳細介紹了該主題&#xff0c;這使得創建模塊非常簡單。 顯然&#xff0c;需要做些事情-這是關于為Play 2創建模塊和插…

Dotnet Core

Global Exceptionhttp://www.talkingdotnet.com/global-exception-handling-in-aspnet-core-webapi/轉載于:https://www.cnblogs.com/zwheui/p/6339692.html

交友系統設計:哪種地理空間鄰近算法更快?

小熊學Java&#xff1a;https://javaxiaobear.cn 交友與婚戀是人們最基本的需求之一。隨著互聯網時代的不斷發展&#xff0c;移動社交軟件已經成為了人們生活中必不可少的一部分。然而&#xff0c;熟人社交并不能完全滿足年輕人的社交與情感需求&#xff0c;于是陌生人交友平臺…

linux ntp 'ntp_request.c'遠程拒絕服務漏洞,NTP 'ntp_request.c'遠程拒絕服務漏洞

NTP ntp_request.c遠程拒絕服務漏洞發布日期&#xff1a;2013-12-30更新日期&#xff1a;2014-01-09受影響系統&#xff1a;NTP NTP 描述&#xff1a;--------------------------------------------------------------------------------BUGTRAQ ID: 64692CVE(CAN) ID: CVE-20…

指針的內容 ; 指針的地址 指針所指向的內容 指針的類型 指針所指向的類型...

這幾個個東東很具有迷惑性。 int a10; //假設a的地址是 0x0000004C int *p; //假設p的地址是 0x0035FA94 p&a; 指針的內容&#xff1a;指針里面存放的是地址。 指針p里面存放的是a的地址(&a)。即指針p里面存放的內容是0x0000004C。 指針的地址&#xff…

Apache Camel教程– EIP,路由,組件,測試和其他概念的簡介

公司之間的數據交換增加了很多。 必須集成的應用程序數量也增加了。 這些接口使用不同的技術&#xff0c;協議和數據格式。 但是&#xff0c;這些應用程序的集成應以標準化的方式建模&#xff0c;有效實現并由自動測試支持。 企業集成模式&#xff08;EIP&#xff09;[1]中存在…

iOS開發UI篇—UITableview控件簡單介紹

一、基本介紹 在眾多移動應?用中,能看到各式各樣的表格數據 。 在iOS中,要實現表格數據展示,最常用的做法就是使用UITableView&#xff0c;UITableView繼承自UIScrollView,因此支持垂直滾動,?且性能極佳 。 UITableview有分組和不分組兩種樣式&#xff0c;可以在storyboard或…

PL/SQL 08 異常 exception

--PL/SQL錯誤 編譯時 運行時--運行時的出錯處理 EXCEPTION --異常處理塊DECLARE …BEGIN …EXCEPTION WHEN OTHERS THEN handler_error(…);END; --用戶自定義的異常DECLARE e_TooManyStudents EXCEPTION; …BEGIN … RAISE e_TooManyStudents; …EXCEPTION WHEN e_TooMany…

html鼠標事件沒反應,鼠標有時候點擊沒反應怎么解決

關于鼠標有時候點擊沒反應的問題&#xff0c;一些網友顯得一頭霧水&#xff0c;那這該怎么解決呢?下面就由小編來給你們說說鼠標有時候點擊沒反應的原因及解決方法吧&#xff0c;希望可以幫到你們哦!鼠標有時候點擊沒反應的解決方法一&#xff1a;一&#xff0c;系統繁忙&…

動態ADF火車:以編程方式添加火車停靠站

我將展示如何以編程方式“即時”將火車停靠站添加到ADF火車中。 在我的用例中&#xff0c;我有一些票務預訂應用程序。 它具有訓練模型的有限任務流。 在火車的第一站&#xff0c;用戶輸入乘客的數量&#xff0c;在隨后的站點&#xff0c;他們輸入一些乘客的信息。 帶有乘客信息…

修改sqlserver的數據庫排序規則語句

alter database SOETMS collate Chinese_PRC_CI_AS 轉載于:https://www.cnblogs.com/lxboy2009/p/5481977.html

關于存儲過程權限

關于ORACLE賬號的權限問題&#xff0c;一般分為兩種權限&#xff1a; 系統權限: 允許用戶執行特定的數據庫動作&#xff0c;如創建表、創建索引、創建存儲過程等 對象權限: 允許用戶操縱一些特定的對象&#xff0c;如讀取視圖&#xff0c;可更新某些列、執行存儲過程等 像這種查…

寧波鎮海2021年高考成績查詢,最新!2021年,寧波鎮海區的這14所中小學“爆了...

寧波鎮海區教育局發布了2021年公辦學校小學一年級、初中一年級招生第一次預警&#xff0c;這也是寧波首個發布2021年公辦學校招生預警的縣、市、區。根據最新數據摸排&#xff0c;寧波鎮海區有8所小學紅色預警、2所初中紅色預警&#xff0c;1所小學黃色預警、3所初中黃色預警。…

用Java解決生產者-消費者問題

當我們嘗試多線程編程時&#xff0c;生產者-消費者問題是最常見的問題之一。 盡管不像多線程編程中的其他一些問題那樣具有挑戰性&#xff0c;但是錯誤地實現此問題可能會造成應用程序混亂。 生產的物品將不使用&#xff0c;開始的物品將被跳過&#xff0c;消耗量取決于生產是在…