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,一经查实,立即删除!

相关文章

鸿蒙系统的全面开源,华为:打造全球的操作系统,鸿蒙今日全面开源!

原标题&#xff1a;华为&#xff1a;打造全球的操作系统&#xff0c;鸿蒙今日全面开源&#xff01;今日下午&#xff0c;2019华为全球开发者大会在华为松山湖基地正式开幕。华为正式对外推出了自研操作系统——鸿蒙系统(Harmony OS)。华为消费者业务CEO余承东指出&#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,// 加载完成后,调…

交友系统设计:哪种地理空间邻近算法更快?

小熊学Java&#xff1a;https://javaxiaobear.cn 交友与婚恋是人们最基本的需求之一。随着互联网时代的不断发展&#xff0c;移动社交软件已经成为了人们生活中必不可少的一部分。然而&#xff0c;熟人社交并不能完全满足年轻人的社交与情感需求&#xff0c;于是陌生人交友平台…

Apache Camel教程– EIP,路由,组件,测试和其他概念的简介

公司之间的数据交换增加了很多。 必须集成的应用程序数量也增加了。 这些接口使用不同的技术&#xff0c;协议和数据格式。 但是&#xff0c;这些应用程序的集成应以标准化的方式建模&#xff0c;有效实现并由自动测试支持。 企业集成模式&#xff08;EIP&#xff09;[1]中存在…

iOS开发UI篇—UITableview控件简单介绍

一、基本介绍 在众多移动应⽤用中,能看到各式各样的表格数据 。 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView&#xff0c;UITableView继承自UIScrollView,因此支持垂直滚动,⽽且性能极佳 。 UITableview有分组和不分组两种样式&#xff0c;可以在storyboard或…

动态ADF火车:以编程方式添加火车停靠站

我将展示如何以编程方式“即时”将火车停靠站添加到ADF火车中。 在我的用例中&#xff0c;我有一些票务预订应用程序。 它具有训练模型的有限任务流。 在火车的第一站&#xff0c;用户输入乘客的数量&#xff0c;在随后的站点&#xff0c;他们输入一些乘客的信息。 带有乘客信息…

关于存储过程权限

关于ORACLE账号的权限问题&#xff0c;一般分为两种权限&#xff1a; 系统权限: 允许用户执行特定的数据库动作&#xff0c;如创建表、创建索引、创建存储过程等 对象权限: 允许用户操纵一些特定的对象&#xff0c;如读取视图&#xff0c;可更新某些列、执行存储过程等 像这种查…

宁波镇海2021年高考成绩查询,最新!2021年,宁波镇海区的这14所中小学“爆了...

宁波镇海区教育局发布了2021年公办学校小学一年级、初中一年级招生第一次预警&#xff0c;这也是宁波首个发布2021年公办学校招生预警的县、市、区。根据最新数据摸排&#xff0c;宁波镇海区有8所小学红色预警、2所初中红色预警&#xff0c;1所小学黄色预警、3所初中黄色预警。…

超出了GC开销限制– Java堆分析

这篇文章是我们原来的GC超出限制的问题模式帖子的延续。 正确的Java堆分析对于消除O​​utOfMemoryError&#xff1a;GC开销问题至关重要。 如果您不熟悉此Java HotSpot 1.6错误&#xff0c;建议您首先阅读有关此主题的第一篇文章 。 本文将为您提供一个示例程序和一个教程&…

cdockpane限制调整大小_影视后期制作小伙伴必看:使用AU对声音质量进行调整的三大技巧...

一、增幅一般人进入AU的音频调整界面&#xff0c;会使用图中的旋钮进行音量调整&#xff0c;这种操作是错误的&#xff0c;因为通过拖拽并不能确定调整音量的大小幅度&#xff0c;精准度极低&#xff0c;反复操作才能试出最佳音量&#xff0c;效率极低。最优方案是使用左侧效果…

华润置地php面试题_从一流到顶流|2020华润置地与沈阳一起美好

如果用一句话来形容华润置地进入沈阳13年的发展历程&#xff0c;你认为是什么&#xff1f;“从优秀到卓越”。用2020年的语言你给我翻译一下&#xff1f;“从一流到顶流”&#xff01;01/ 初识的美好犹记2007年1月&#xff0c;央企华润置地首进沈阳&#xff0c;在大馆原址呈现出…

cmd控制屏幕光标_电脑控制手机?上班时间愉快尽情地玩手机吧!它值得您拥有!...

在现今时代&#xff0c;手机已成为人们必不可少的工具&#xff0c;有的时候甚至可以说手机比电脑方便好用多了&#xff0c;例如某些实用的APP软件就只有手机端并没有电脑端&#xff0c;想使用的话就得整天捧着手机盯着不放。但别忘记&#xff0c;我们大多数都是打工族&#xff…

xp系统设置锁定计算机,系统锁定时不关机的诀窍 给XP系统关闭计算机再加一把锁...

很多用户抱怨在使用电脑的过程中&#xff0c;总是经常会被琐碎的事情打断&#xff0c;有时候难免暂时离开电脑&#xff0c;处于便利和资料安全&#xff0c;我们往往会按下“WindowsL”来锁定计算机。这样&#xff0c;操作方便同时又能阻止他人乱动我们的计算机。但是如果遇到好…

gitee项目404问题_七款开源项目,让你数据库管理不再成为一个问题

在开发过程中&#xff0c;数据库是必不可少的一环&#xff0c;但大多数情况下开发者们还是在用命令行来管理数据库。虽然在外人看起来输入一行行代码非常的酷炫&#xff0c;但其中的繁琐可能也只有开发者知道。七款开源项目&#xff0c;让你数据库管理不再成为一个问题今天 Git…

vb 窗体html表格,VB.Net – 高级表格

在本章中&#xff0c;让我们研究以下概念 :在应用程序中添加菜单和子菜单在表单中添加剪切&#xff0c;复制和粘贴功能锚定和对接控件表格模态表格添加菜单和子菜单应用程序中的菜单传统上&#xff0c;菜单&#xff0c;MainMenu&#xff0c;ContextMenu和MenuItem类用于在Windo…

SpringMVC后台接收list类型的数据的实现方式

一、背景 最近在做一些东西的时候&#xff0c;遇到一个需要Springmvc后台接收list类型数据的需求&#xff0c;几经辗转才完美解决了这个问题&#xff0c;今天记下来方便以后使用&#xff0c;也分享给需要的小伙伴们~ 二、实现方式 实现方式一 前端页面 1 <% page language&q…

Maven集成测试和Spring Restful Services

介绍 我的原始博客通过一个非常简单的示例展示了如何分离Maven单元和集成测试。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html此后&#xff0c;许多人要求我提供比最初使用的示例更实际的示例。 这篇文章展示了如何在实际环境中&#…

玩cf出现outofmemory_CF画质粗糙平衡感人,却能历经十年经久不衰,靠的是什么?...

Hello大家好&#xff0c;我是沐辰。《穿越火线》这款游戏国内运营时间已长达十年&#xff0c;从最早接触这款游戏开始&#xff0c;很多玩家都在这里烙刻下了许多关于青春的回忆。CF的许多问题一直颇受诟病&#xff0c;例如落后且粗糙的画质、英雄级武器与平民武器的巨大差距、千…

jquery遍历ajax返回的json数据

我们以前在前端遍历ajax拿到的数据一般都是用for或其他方式遍历&#xff0c;这样做麻烦且费事&#xff0c;效率不高&#xff0c;下面提供一个函数&#xff0c;只需调用函数即可把数据遍历出来&#xff0c;方便高效。 html代码&#xff1a; <html> <head><script…

Apache JMeter:随心所欲进行负载测试

这是有关使用Apache JMeter进行负载测试的第二篇文章&#xff0c;请在此处阅读第一篇文章&#xff1a; 有关对关系数据库进行负载测试的分步教程。 JMeter有很多采样器 。 如果您需要JMeter不提供的采样器&#xff0c;则可以编写自定义采样器。 &#xff08;自定义采样器在JMet…