- 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项目,请执行以下操作:
- 单击“新的Web应用程序项目”按钮 在工具栏中。 也可以使用菜单文件> Web应用程序项目来执行此操作
- 将打开“创建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添加到您的项目
- 右键单击项目,然后选择菜单项Build Path> Configure Build Path…。
- 单击添加外部JAR按钮
- 选择$ JERSEY_HOME / lib和$ JAXB_HOME / lib文件夹中的所有JAR。 您可以更好地了解和重用所有这些JAR创建用户库
- 您还需要复制应用程序的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>
创建一个简单的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