用 Jersey 创建 REST 服务

本项目实例,假设你已经具备了 Maven 的基础知识,如果是 Maven 新手,参见本文最后的扩展阅读有关 Maven 的操作

初始化 Maven web 应用

  1. mvn archetype:generate -DgroupId=com.waylau.rest -DartifactId=jersey2 -DarchetypeArtifactId=maven-archetype-webapp -DinteractivMode=false -DgroupId=com.waylau.rest -DartifactId=jersey-webapp -Dpackage=com.waylau.rest

用 Jersey 创建 REST 服务 - 图1

用 Jersey 创建 REST 服务 - 图2

用 Jersey 创建 REST 服务 - 图3

如果 没有未自动生成 java ,可以自己创建补齐。

导入 eclipse 中方便开发。

添加 Tomcat 容器

可以内嵌 Jetty 、Tomcat 等 web 容器,这样就方便运行项目,进行调试

添加 maven 插件,嵌入 Tomcat 7

  1. <plugins>
  2. <plugin>
  3. <groupId>org.apache.maven.plugins</groupId>
  4. <artifactId>maven-compiler-plugin</artifactId>
  5. <version>3.2</version>
  6. <configuration>
  7. <source>1.7</source>
  8. <target>1.7</target>
  9. </configuration>
  10. </plugin>
  11. <plugin>
  12. <groupId>org.apache.tomcat.maven</groupId>
  13. <artifactId>tomcat7-maven-plugin</artifactId>
  14. <version>2.2</version>
  15. <configuration>
  16. <uriEncoding>UTF-8</uriEncoding>
  17. <path>/</path>
  18. </configuration>
  19. </plugin>
  20. </plugins>

修改 JUnit 的版本 ,如下:

  1. <dependency>
  2. <groupId>junit</groupId>
  3. <artifactId>junit</artifactId>
  4. <version>4.12</version>
  5. <scope>test</scope>
  6. </dependency>

进行编译

  1. mvn clean install

问题

  1. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

用 Jersey 创建 REST 服务 - 图4

用 Jersey 创建 REST 服务 - 图5

添加

  1. <dependency>
  2. <groupId>javax.servlet</groupId>
  3. <artifactId>javax.servlet-api</artifactId>
  4. <version>3.1.0</version>
  5. <scope>provided</scope>
  6. </dependency>
  7. <dependency>
  8. <groupId>javax.servlet.jsp</groupId>
  9. <artifactId>jsp-api</artifactId>
  10. <version>2.2</version>
  11. <scope>provided</scope>
  12. </dependency>

进行编译

  1. mvn clean install

运行 web 项目:

  1. mvn tomcat7:run

自从,一个简单的 maven web 项目已经完成。

添加 Jersey,提供 REST 服务

添加 Jersey 模块

  1. <dependency>
  2. <groupId>org.glassfish.jersey.containers</groupId>
  3. <artifactId>jersey-container-servlet</artifactId>
  4. <version>${jersey.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.glassfish.jersey.media</groupId>
  8. <artifactId>jersey-media-moxy</artifactId>
  9. <version>${jersey.version}</version>
  10. </dependency>

这里用 jersey.version 变量来进行多个模块,相同版本的管理,其中 jersey-media-moxy 用来处理 json 的转换

在 pom.xml 中添加

  1. <properties>
  2. <jersey.version>2.14</jersey.version>
  3. </properties>

此时,项目已经具备了开发 Jersey REST 的能力,下面添加代码

一个 简单的 Jersey REST 应用

创建以下 java 文件

用 Jersey 创建 REST 服务 - 图6

RestApplication.java

  1. package com.waylau.rest;
  2. import org.glassfish.jersey.moxy.json.MoxyJsonFeature;
  3. import org.glassfish.jersey.server.ResourceConfig;
  4. /**
  5. * REST 主应用
  6. *
  7. * @author waylau.com
  8. * 2015-1-12
  9. */
  10. public class RestApplication extends ResourceConfig {
  11. public RestApplication() {
  12. //服务类所在的包路径
  13. packages("com.waylau.rest.resource");
  14. //注册 JSON 转换器
  15. register(MoxyJsonFeature.class);
  16. }
  17. }

HelloResource.java

  1. package com.waylau.rest.resource;
  2. import javax.ws.rs.GET;
  3. import javax.ws.rs.Path;
  4. import javax.ws.rs.Produces;
  5. import javax.ws.rs.core.MediaType;
  6. /**
  7. * 测试用的 Resource
  8. *
  9. * @author waylau.com
  10. * 2015年1月12日
  11. */
  12. @Path("hello")
  13. public class HelloResource {
  14. /**
  15. * 方法处理 HTTP GET 请求. 返回给客户端的对象是
  16. * 转成了"text/plain" 媒体类型
  17. *
  18. * @return String ,转成了 text/plain 响应
  19. */
  20. @GET
  21. @Produces(MediaType.TEXT_PLAIN)
  22. public String getIt() {
  23. return "Got it! Welcome to waylau's REST world!";
  24. }
  25. }

解释:在 hello 路径下,可以访问到 HelloResource 中的 getIt() 方法返回的资源。

在 web.xml 增加 Jersey 的过滤器

  1. <!-- jersey start -->
  2. <servlet>
  3. <servlet-name>Jersey Web Application</servlet-name>
  4. <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  5. <init-param>
  6. <param-name>javax.ws.rs.Application</param-name>
  7. <param-value>com.waylau.rest.RestApplication</param-value>
  8. </init-param>
  9. <load-on-startup>1</load-on-startup>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>Jersey Web Application</servlet-name>
  13. <url-pattern>/rest/*</url-pattern>
  14. </servlet-mapping>
  15. <!-- jersey end -->

解释:所有的Jersey REST 接口都发布到 rest 路径下。

ok ,服务端代码敲完,现在开发客户端,打开 index.jsp ,添加如下

  1. <a href="/rest/hello">hello world</a>

这句的含义是,调用 Jersey REST 发布的 /rest/hello接口

执行 mvn tomcat7:run

首页是这样的

用 Jersey 创建 REST 服务 - 图7

点击 hello world,就能调用 REST 接口了!

用 Jersey 创建 REST 服务 - 图8

扩展阅读