- Google AppEngine帐户
- Eclipse Galileo(3.5.x)
-
适用于Java的Google App Engine SDK
- 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;
}
@XmlElement
public String getFirstName() {
return entity.getFirstName();
}
@XmlElement
public String getLastName() {
return entity.getLastName();
}
@XmlElement
public Date getHireDate() {
return entity.getHireDate();
}
@XmlElement
public 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 code
Employee 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