- JAX-WS (Java API for XML Web Services):这是目前最主流、最成熟的 Java WebService 技术,它用于构建基于 SOAP (Simple Object Access Protocol) 协议的 WebService,从 Java 6 开始,JAX-WS 已经被内置在 JDK 中,无需额外安装复杂的框架,非常方便。
- JAX-RS (Java API for RESTful Web Services):这是用于构建 RESTful 风格 WebService 的 API,它更轻量级,通常与 JSON 数据格式配合使用,是目前移动端和前后端分离项目中最流行的架构。
下面我将分别详细介绍如何使用这两种技术实现 WebService,并提供完整的代码示例。

使用 JAX-WS 实现 SOAP WebService
JAX-WS 的核心思想是,你只需要编写一个普通的 Java 接口和它的实现类,然后通过一些注解来将其发布成 WebService,客户端也可以通过工具根据 WSDL (Web Services Description Language) 文件生成客户端代码。
服务端实现
我们将创建一个简单的 HelloService,它提供一个 sayHello 方法。
步骤 1:创建 Maven 项目并添加依赖
虽然 JAX-WS 在 JDK 中,但为了方便开发和打包,我们使用 Maven,创建一个 maven-archetype-webapp 项目,并在 pom.xml 中添加依赖,对于现代项目,建议使用 jakarta 命名空间。

<dependencies>
<!-- JAX-WS API (for Jakarta EE 9+) -->
<dependency>
<groupId>jakarta.xml.ws</groupId>
<artifactId>jakarta.xml.ws-api</artifactId>
<version>3.0.1</version>
</dependency>
<!-- JAX-WS RI (Implementation) -->
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>3.0.2</version>
</dependency>
</dependencies>
注意:如果你使用的是 Java 8 或更早的版本,或者 Jakarta EE 8,你需要使用 javax.xml.ws 命名空间。
步骤 2:创建服务接口并添加注解
这个接口将定义 WebService 的契约。
// src/main/java/com/example/HelloService.java
package com.example;
import jakarta.jws.WebMethod;
import jakarta.jws.WebParam;
import jakarta.jws.WebService;
// @WebService 注解将这个类标记为一个 WebService
@WebService
public interface HelloService {
// @WebMethod 注解将这个方法暴露为 WebService 的一个操作
// @WebParam 注解用于指定参数的名称,这在 WSDL 中会体现
@WebMethod
String sayHello(@WebParam(name = "name") String name);
}
步骤 3:创建服务实现类

// src/main/java/com/example/HelloServiceImpl.java
package com.example;
import jakarta.jws.WebService;
// 使用 @WebService 注解实现接口,endpointInterface 指向接口的全限定名
@WebService(endpointInterface = "com.example.HelloService")
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello, " + name + "!";
}
}
步骤 4:发布 WebService
你可以通过一个简单的 Java 类来启动并发布这个服务,最简单的方式是使用 Endpoint 类。
// src/main/java/com/example/WebServicePublisher.java
package com.example;
import jakarta.xml.ws.Endpoint;
public class WebServicePublisher {
public static void main(String[] args) {
// 定义服务的访问地址
String address = "http://localhost:8888/ws/hello";
// 创建服务实现类的实例
HelloService helloService = new HelloServiceImpl();
// 发布服务
Endpoint.publish(address, helloService);
System.out.println("WebService is published at: " + address);
}
}
步骤 5:运行和测试
- 运行
WebServicePublisher的main方法。 - 打开浏览器,访问
http://localhost:8888/ws/hello?wsdl。 - 如果看到一串 XML(WSDL 文件),说明你的 WebService 已经成功发布!
如何测试?
你可以使用 wsimport 命令(JDK 自带)来生成客户端代码并进行调用。
-
打开一个新的命令行窗口,执行以下命令生成客户端代码:
wsimport -p com.example.client -keep http://localhost:8888/ws/hello?wsdl
-p: 指定生成的客户端代码包名。-keep: 保留生成的源文件。
-
创建一个测试客户端类:
// src/main/java/com/example/client/HelloServiceClient.java package com.example.client; public class HelloServiceClient { public static void main(String[] args) { // 创建服务实例 HelloService_Service service = new HelloService_Service(); // 获取服务端口 (SEI - Service Endpoint Interface) HelloService port = service.getHelloServicePort(); // 调用远程方法 String response = port.sayHello("WebService Client"); System.out.println("Response from server: " + response); } } -
运行
HelloServiceClient,你将在控制台看到输出:Response from server: Hello, WebService Client!
使用 JAX-RS 实现 RESTful WebService
JAX-RS 是一套规范,其最流行的实现是 Jersey 和 RESTEasy,这里我们以 Jersey 为例。
服务端实现
我们将创建一个 RESTful 资源,提供 GET /hello/{name} 接口。
步骤 1:创建 Maven 项目并添加依赖
<dependencies>
<!-- Jersey Core -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-http</artifactId>
<version>3.1.1</version>
</dependency>
<!-- Jersey Jackson (for JSON support) -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
步骤 2:创建资源类
使用 @Path 注解来定义资源的 URI 路径,@GET、@POST 等注解定义 HTTP 方法。
// src/main/java/com/example/HelloResource.java
package com.example;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
// @Path 定义了这个资源的基 URI
@Path("/hello")
public class HelloResource {
// @GET 表示这个方法处理 HTTP GET 请求
// @Path("...") 定义了相对于类@Path的子路径
// @PathParam("...") 从路径中提取参数
// @Produces 定义了该方法可以生成的媒体类型,这里是 JSON
@GET
@Path("/{name}")
@Produces(MediaType.APPLICATION_JSON)
public Greeting sayHello(@PathParam("name") String name) {
return new Greeting("Hello, " + name + "!");
}
}
// 一个简单的 POJO (Plain Old Java Object),用于 JSON 序列化
class Greeting {
private String message;
public Greeting() {}
public Greeting(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
步骤 3:创建应用启动类
// src/main/java/com/example/GrizzlyServer.java
package com.example;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import java.net.URI;
public class GrizzlyServer {
// 定义服务器基 URI
public static final String BASE_URI = "http://localhost:8080/api/";
public static void main(String[] args) {
// 创建一个 ResourceConfig 实例,并注册我们的资源类
final ResourceConfig rc = new ResourceConfig().packages("com.example");
// 创建并启动 Grizzly HTTP 服务器
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
System.out.println("Jersey app started with WADL available at " + BASE_URI + "application.wadl\nHit enter to stop it...");
try {
System.in.read();
} catch (Exception e) {
e.printStackTrace();
} finally {
server.shutdownNow();
}
}
}
步骤 4:运行和测试
- 运行
GrizzlyServer的main方法。 - 打开浏览器或使用 API 测试工具(如 Postman、curl)访问
http://localhost:8080/api/hello/World。 - 你将得到 JSON 响应:
{"message":"Hello, World!"}。
总结与对比
| 特性 | JAX-WS (SOAP) | JAX-RS (REST) |
|---|---|---|
| 协议 | SOAP (基于 XML) | HTTP (通常与 JSON 配合) |
| 风格 | 面向服务,强调接口契约 | 面向资源,强调资源本身 |
| 数据格式 | 主要是 XML | 主要是 JSON, XML, Text |
| 标准性 | 协议非常严格和标准化 | 更灵活,轻量级 |
| 性能 | SOAP 协议开销较大,性能相对较低 | 轻量级,性能高 |
| 适用场景 | 企业级应用、金融、电信等对安全性、事务性要求高的场景 | 移动应用、前后端分离项目、公开 API |
| 学习曲线 | 较复杂,需要理解 SOAP, WSDL, UDDI 等 | 相对简单,易于理解和使用 |
| Java 集成 | 内置于 JDK (Java 6+) | 需要引入第三方实现库 (如 Jersey, RESTEasy) |
如何选择?
- 如果你的项目需要与传统的、基于 SOAP 的企业系统(如 .NET 服务)集成,或者对消息的可靠性、安全性有非常高的、标准化的要求,那么选择 JAX-WS。
- 如果你正在开发一个新的、现代化的 Web 应用,特别是前后端分离架构,或者需要为移动 App 提供 API,JAX-RS (REST) 是不二之选。 它的简单、灵活和高性能使其成为当前的主流。
