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.mzph.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;消耗量取决于生产是在…