- 环境准备:配置 Maven 和 IDE(以 IntelliJ IDEA 为例)。
- 创建项目:使用 Maven 快速搭建项目骨架。
- 编写代码:创建一个简单的资源类,提供 Web Service 接口。
- 配置和运行:配置 Web 服务器(内嵌的 Jetty)并启动服务。
- 测试:使用浏览器和工具(如 Postman 或
curl)来调用和测试我们的 Web Service。
环境准备
在开始之前,请确保您已经安装并配置好以下环境:

- JDK 8 或更高版本
- Maven 3.6 或更高版本
- IDE(推荐 IntelliJ IDEA 或 Eclipse,社区版即可)
创建 Maven 项目
我们将使用 Maven 来管理项目依赖和构建过程。
- 打开您的 IDE(以 IntelliJ IDEA 为例)。
- 选择
File->New->Project...。 - 在左侧选择
Maven,确保勾选Create from archetype。 - 在 archetype 列表中,选择
org.apache.maven.archetypes:maven-archetype-webapp,然后点击Next。 - 填写项目信息:
- GroupId:
com.example - ArtifactId:
java-webservice-example - Version:
0-SNAPSHOT - Packaging:
war(Web 应用归档格式)
- GroupId:
- 点击
Finish,IDE 会自动为您下载 Maven 依赖并创建项目结构。
项目创建后,您会看到一个类似下面的目录结构:
java-webservice-example
├── pom.xml
└── src
└── main
├── java
│ └── (通常是空的)
├── resources
│ └── (通常是空的)
└── webapp
├── index.jsp
└── WEB-INF
└── web.xml
添加 Jersey 依赖
我们需要在 pom.xml 文件中添加 Jersey 的核心依赖,这些依赖会告诉我们的项目如何使用 Jersey 来创建和运行 Web Service。
打开 pom.xml 文件,在 <dependencies> 标签内添加以下内容:

<dependencies>
<!-- JUnit 5 (如果项目模板自带,可以保留) -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<!-- Jersey 核心依赖 -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>3.1.2</version> <!-- 建议使用较新版本 -->
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>3.1.2</version>
</dependency>
<!-- 用于将 Jersey 应用部署到内嵌服务器的依赖 -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-jetty-http</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>11.0.15</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>11.0.15</version>
</dependency>
</dependencies>
说明:
jersey-container-servlet: 用于将 Jersey 集成到 Servlet 容器中。jersey-hk2: Jersey 的依赖注入框架。jersey-container-jetty-http和jetty-*: 用于启动一个内嵌的 Jetty 服务器,这样我们就不需要单独安装 Tomcat 或其他服务器了。
编写 Web Service 代码
现在我们来创建核心的 Web Service 代码。
-
创建资源类 (Resource Class)
在
src/main/java目录下,创建一个包,com.example.service,在该包中创建一个名为UserResource.java的 Java 类。
(图片来源网络,侵删)这个类将使用 JAX-RS 的注解来定义一个 Web Service 端点。
package com.example.service; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; /** * 用户资源类,提供用户相关的 RESTful API * Path 定义了该资源的基 URL 路径 * Produces 定义了该资源能产生的媒体类型,这里是 JSON */ @Path("/users") @Produces(MediaType.APPLICATION_JSON) public class UserResource { // 使用内存数据库来模拟数据存储 private final ConcurrentMap<Integer, User> userStore = new ConcurrentHashMap<>(); private final AtomicInteger idCounter = new AtomicInteger(); public UserResource() { // 初始化一些数据 User user1 = new User(1, "张三", "zhangsan@example.com"); User user2 = new User(2, "李四", "lisi@example.com"); userStore.put(user1.getId(), user1); userStore.put(user2.getId(), user2); idCounter.set(3); // 下一个用户的ID将是3 } /** * 获取所有用户 * GET /users * @return 用户列表 */ @GET public List<User> getAllUsers() { return new ArrayList<>(userStore.values()); } /** * 根据ID获取单个用户 * GET /users/{id} * @param id 用户ID * @return 用户对象 */ @GET @Path("/{id}") public User getUserById(@PathParam("id") int id) { User user = userStore.get(id); if (user == null) { // 如果用户不存在,抛出 404 Not Found 异常 throw new NotFoundException("User with id " + id + " not found."); } return user; } /** * 创建一个新用户 * POST /users * @param user 从请求体中解析出的用户对象 * @return 创建成功的用户对象(会包含生成的ID) */ @POST @Consumes(MediaType.APPLICATION_JSON) // 指定消费的媒体类型是 JSON public User createUser(User user) { int newId = idCounter.getAndIncrement(); user.setId(newId); userStore.put(newId, user); return user; // 返回创建的对象,HTTP 状态码为 201 Created } } /** * 用户实体类 * 这是一个简单的 POJO (Plain Old Java Object) */ class User { private int id; private String name; private String email; // 无参构造函数 (反序列化时可能需要) public User() {} public User(int id, String name, String email) { this.id = id; this.name = name; this.email = email; } // Getter 和 Setter 方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + '}'; } }代码解释:
@Path("/users"): 定义了该资源的 URI 路径,所有这个类的方法的 URL 都将以/users开头。@Produces(MediaType.APPLICATION_JSON): 声明这个资源默认返回 JSON 格式的数据。@GET: 标记 HTTP GET 方法,用于获取数据。@POST: 标记 HTTP POST 方法,用于创建新数据。@Path("/{id}"): 在类路径基础上添加一个路径参数id。@PathParam("id"): 将 URL 中的id参数值注入到方法的id变量中。@Consumes(MediaType.APPLICATION_JSON): 声明这个方法可以接收 JSON 格式的请求体。
-
创建 Jersey 应用程序引导类
为了让 Jersey 能够扫描并注册我们的
UserResource,我们需要一个配置类。在
com.example.service包下创建MyApplication.java:package com.example.service; import org.glassfish.jersey.server.ResourceConfig; import javax.ws.rs.ApplicationPath; /** * Jersey 应用程序配置类 * @ApplicationPath 定义了所有 JAX-RS 资源的基础路径 */ @ApplicationPath("/api") // 所有 API 请求将以 /api 开头 public class MyApplication extends ResourceConfig { public MyApplication() { // 注册资源类 register(UserResource.class); } } -
配置 Web 容器
我们需要让 Jetty 服务器知道如何启动我们的 Jersey 应用,这通过一个
main方法来完成。在
src/main/java下创建一个根级别的Main.java文件(不在任何包下):import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.glassfish.jersey.servlet.ServletContainer; public class Main { public static void main(String[] args) throws Exception { // 1. 创建 Jetty 服务器实例,监听 8080 端口 Server server = new Server(8080); // 2. 创建 ServletContextHandler,用于管理 Servlet 上下文 ServletContextHandler handler = new ServletContextHandler(); handler.setContextPath("/"); // 设置应用的根上下文 // 3. 创建 Jersey Servlet 容器 // 初始化参数指定 Jersey 应用程序的配置类 ServletHolder jerseyServlet = new ServletHolder(new ServletContainer()); jerseyServlet.setInitParameter("javax.ws.rs.Application", "com.example.service.MyApplication"); // 将 Jersey Servlet 映射到 /api 路径 handler.addServlet(jerseyServlet, "/api/*"); // 4. 将 handler 设置给 server server.setHandler(handler); // 5. 启动服务器 System.out.println("Jersey Application started at http://localhost:8080/api"); System.out.println("Hit Enter to stop it..."); server.start(); server.join(); } }
运行和测试
-
运行程序
- 在 IDE 中,找到
Main.java文件。 - 右键点击
main方法,选择Run 'Main.main()'。 - 您应该能在控制台看到以下输出:
Jersey Application started at http://localhost:8080/api Hit Enter to stop it... - 这表示 Web Service 已经成功启动,并正在监听 8080 端口。
- 在 IDE 中,找到
-
测试 API 您可以使用以下几种方式来测试您的 Web Service:
-
使用浏览器 (简单 GET 请求)
- 获取所有用户:
在浏览器地址栏输入:
http://localhost:8080/api/users您应该能看到类似以下的 JSON 响应:[ {"id":1,"name":"张三","email":"zhangsan@example.com"}, {"id":2,"name":"李四","email":"lisi@example.com"} ] - 获取单个用户 (ID=1):
在浏览器地址栏输入:
http://localhost:8080/api/users/1您应该能看到:{"id":1,"name":"张三","email":"zhangsan@example.com"}
- 获取所有用户:
在浏览器地址栏输入:
-
使用
curl命令行工具- 获取所有用户:
curl http://localhost:8080/api/users
- 获取单个用户 (ID=1):
curl http://localhost:8080/api/users/1
- 创建一个新用户 (POST 请求):
curl -X POST \ -H "Content-Type: application/json" \ -d '{"name":"王五","email":"wangwu@example.com"}' \ http://localhost:8080/api/users成功后,您会得到返回的新用户信息,其中包含了自动生成的 ID:
{"id":3,"name":"王五","email":"wangwu@example.com"}
- 获取所有用户:
-
使用 Postman 或其他 API 测试工具
- 创建一个新的请求,方法设为
GET,URL 填http://localhost:8080/api/users,然后点击 "Send"。 - 创建一个
POST请求,URL 填http://localhost:8080/api/users。 - 在 "Body" 标签页下,选择 "raw" 和 "JSON"。
- 输入 JSON 数据:
{"name":"王五","email":"wangwu@example.com"}。 - 点击 "Send",您将收到响应。
- 创建一个新的请求,方法设为
-
您已经成功创建并运行了一个基于 Jersey 的 Java Web Service 实例,这个例子涵盖了:
- 使用 Maven 管理项目。
- 定义 JAX-RS 资源类 (
@Path,@GET,@POST,@Produces,@Consumes)。 - 创建 Jersey 应用配置类。
- 使用内嵌 Jetty 服务器启动服务。
- 通过多种方式测试 RESTful API。
这是一个非常好的起点,您可以根据这个基础进行扩展,
- 添加
PUT和DELETE方法来更新和删除资源。 - 连接真实的数据库(如 MySQL, PostgreSQL)。
- 添加安全认证(如 JWT)。
- 使用更高级的框架(如 Spring Boot)来简化配置。
