Webservice是一种基于Web的服务架构,允许不同应用系统通过网络进行交互和数据交换,而无需了解底层实现技术,在Java生态系统中,Webservice的开发主要依赖于JAX-WS(Java API for XML-Based Web Services)和JAX-RS(Java API for RESTful Web Services)两套标准,本文将详细介绍使用Java开发Webservice的基础知识、核心步骤及最佳实践。

Webservice基础概念
Webservice的核心特性包括跨平台、跨语言和基于标准协议(如HTTP、XML、SOAP),SOAP(Simple Object Access Protocol)是一种基于XML的协议,常用于构建结构化的Webservice;而REST(Representational State Transfer)则更轻量级,基于HTTP方法(GET、POST、PUT、DELETE)实现资源操作,在Java中,JAX-WS是开发SOAP Webservice的官方标准,而JAX-RS(如Jersey、RESTEasy)则用于RESTful Webservice开发。
使用JAX-WS开发SOAP Webservice
环境准备
确保安装JDK 1.8及以上版本,并配置好Maven或Gradle构建工具,以Maven为例,需添加以下依赖:
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.3.3</artifactId>
</dependency>
定义服务接口
通过注解定义Webservice接口:
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService
public interface UserService {
@WebMethod
String getUserInfo(String userId);
}
实现服务类
import javax.jws.WebService;
@WebService(endpointInterface = "com.example.UserService")
public class UserServiceImpl implements UserService {
@Override
public String getUserInfo(String userId) {
return "User: " + userId + ", Name: John Doe";
}
}
发布服务
使用Endpoint类发布服务:

import javax.xml.ws.Endpoint;
public class Publisher {
public static void main(String[] args) {
String address = "http://localhost:8080/user";
UserServiceImpl userService = new UserServiceImpl();
Endpoint.publish(address, userService);
System.out.println("Service published at: " + address);
}
}
启动后,可通过http://localhost:8080/user?wsdl访问WSDL(Web Services Description Language)文件。
使用JAX-RS开发RESTful Webservice
添加依赖(以Jersey为例)
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.35</version>
</dependency>
配置web.xml
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.example.resource</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
创建资源类
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/user")
public class UserResource {
@GET
@Path("/{userId}")
@Produces(MediaType.TEXT_PLAIN)
public String getUserInfo(@PathParam("userId") String userId) {
return "User: " + userId + ", Name: John Doe";
}
}
访问http://localhost:8080/your-app/api/user/123即可获取响应。
核心注解说明
| 注解 | 作用 | 示例 |
|---|---|---|
| @WebService | 标记为Webservice接口/类 | @WebService public interface ... |
| @WebMethod | 标记为Webservice方法 | @WebMethod public String ... |
| @Path | 定义REST资源路径 | @Path("/user") |
| @GET/POST等 | 指定HTTP方法 | @GET public String ... |
| @Produces | 指定响应的MIME类型 | @Produces(MediaType.JSON) |
| @Consumes | 指定接受的请求MIME类型 | @Consumes(MediaType.XML) |
最佳实践
- 异常处理:使用
@WebFault定义自定义SOAP异常,或通过ExceptionMapper处理REST异常。 - 安全性:对Webservice添加HTTPS、OAuth或API Key认证。
- 性能优化:启用缓存(如
@Cacheable),避免频繁序列化/反序列化。 - 测试工具:使用Postman测试RESTful服务,或SoapUI测试SOAP服务。
相关问答FAQs
Q1: 如何在Java中调用外部Webservice?
A1: 对于SOAP服务,可使用JAX-WS的wsimport工具根据WSDL生成客户端代码,或使用WebServiceClient注解动态调用,示例:
UserService service = new UserService_Service().getUserServicePort();
String result = service.getUserInfo("123");
对于REST服务,可使用Jersey Client或Apache HttpClient发送HTTP请求。
Q2: Webservice与REST API的区别是什么?
A2: 主要区别包括:
- 协议:Webservice通常基于SOAP(XML),REST API基于HTTP(JSON/XML)。
- 风格:Webservice强调操作(RPC),REST强调资源(URI)。
- 复杂度:SOAP功能强大(如事务、安全),但较重;REST轻量级,更适合移动端。
- 缓存:REST天然支持HTTP缓存,SOAP需手动实现。
选择时需根据场景:企业级集成可选SOAP,高并发场景可选REST。
