Spring WebService 的两种主流实现方式‌

  • ‌Spring-WS(Spring Web Services)‌:采用 ‌Contract First(自顶向下)‌ 方式,先定义 XSD/WSDL,再生成 Java 代码。适用于企业级、高可维护性的 SOAP 服务。
  • ‌Spring Boot + JAX-WS(通常用 Apache CXF)‌:采用 ‌Contract Last(自底向上)‌ 方式,通过 @WebService 注解将 Java 类暴露为 Web Service。开发更快速,适合快速原型或内部系统集成。

1、‌Spring-WS(Contract First)核心步骤‌

‌添加依赖‌(Maven):

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web-services</artifactId>

</dependency>

<dependency>

<groupId>wsdl4j</groupId>

<artifactId>wsdl4j</artifactId>

</dependency>

‌定义 XSD Schema‌(如 src/main/resources/xsd/login.xsd):

<xs:schema targetNamespace="http://example.com/ws/login"

elementFormDefault="qualified"

xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="loginRequest">

<xs:complexType>

<xs:sequence>

<xs:element name="username" type="xs:string"/>

<xs:element name="password" type="xs:string"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="loginResponse">

<xs:complexType>

<xs:sequence>

<xs:element name="result" type="xs:string"/>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:schema>

‌自动生成 Java 类‌(使用 JAXB2 Maven 插件):

<plugin>

<groupId>org.codehaus.mojo</groupId>

<artifactId>jaxb2-maven-plugin</artifactId>

<version>1.6</version>

<configuration>

<schemaDirectory>${project.basedir}/src/main/resources/xsd/</schemaDirectory>

<outputDirectory>${project.basedir}/src/main/java/</outputDirectory>

</configuration>

<executions>

<execution>

<goals><goal>xjc</goal></goals>

</execution>

</executions>

</plugin>

‌创建 Endpoint‌:

@Endpoint

public class LoginEndpoint {

private static final String NAMESPACE_URI = "http://example.com/ws/login";

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "loginRequest")

@ResponsePayload

public LoginResponse login(@RequestPayload LoginRequest request) {

// 业务逻辑

LoginResponse response = new LoginResponse();

response.setResult("success");

return response;

}

}

‌配置 WebServiceConfig‌:

@Configuration

@EnableWs

public class WebServiceConfig extends WsConfigurerAdapter {

@Bean

public ServletRegistrationBean messageDispatcherServlet(ApplicationContext context) {

MessageDispatcherServlet servlet = new MessageDispatcherServlet();

servlet.setApplicationContext(context);

servlet.setTransformWsdlLocations(true);

return new ServletRegistrationBean(servlet, "/ws/*");

}

@Bean(name = "login")

public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema schema) {

DefaultWsdl11Definition wsdl = new DefaultWsdl11Definition();

wsdl.setPortTypeName("loginPort");

wsdl.setLocationUri("/ws");

wsdl.setSchema(schema);

return wsdl;

}

@Bean

public XsdSchema schema() {

return new SimpleXsdSchema(new ClassPathResource("xsd/login.xsd"));

}

}

‌访问 WSDL‌:

启动应用后,访问 http://localhost:8080/ws/login.wsdl 查看服务描述。

2、‌Spring Boot + CXF(Contract Last)

‌添加依赖‌:

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-spring-boot-starter-jaxws</artifactId>

<version>3.3.1</version>

</dependency>

‌定义接口与实现类‌:

@WebService

public interface OrderWS {

@WebMethod

Order getOrderById(int id);

}

@WebService(endpointInterface = "com.example.OrderWS")

public class OrderWSImpl implements OrderWS {

@Override

public Order getOrderById(int id) {

return new Order(id, "Product", 999.99);

}

}

‌配置发布端点‌:

@Configuration

public class WebServiceConfig {

@Autowired

private OrderWSImpl orderWSImpl;

@Bean

public Endpoint endpoint() {

EndpointImpl endpoint = new EndpointImpl(new SpringBus(), orderWSImpl);

endpoint.publish("/orderws");

return endpoint;

}

}

‌访问 WSDL‌:

http://localhost:8080/orderws?wsdl

3、‌注意事项‌

  • ‌Spring-WS‌ 更适合需要严格契约控制、长期维护的系统。
  • ‌CXF + JAX-WS‌ 开发更快,但耦合度较高,适合内部服务或快速迭代场景。
  • 避免使用过时的 Axis1/Axis2,除非维护遗留系统 ‌。
相关推荐
13609675723几秒前
.env 的三个必查项
后端
长安米粒贵几秒前
接口超时了,为什么重试反而把系统打垮?聊聊超时预算的 4 个误区
后端
骉马代驾1 分钟前
代驾系统长连接实战(二):心跳、断线重连与消息补偿的完整实现
java
程序员Sunday7 分钟前
Spring @Transactional 没回滚?按代理调用、异常和传播行为排查
java·后端·spring
付威202312 分钟前
我用 100 行核心代码,做了一个能接入飞书的 Hermes 式智能体
人工智能·后端
java资料站13 分钟前
案例:Spring Ai/Alibaba《模拟面试器》项目案例
人工智能·spring·面试
苏三说技术16 分钟前
为什么越来越多人用 ZXing?
后端
冰暮流星17 分钟前
sql之is null 运算符
java·数据库·sql
Rain的Java大神之路17 分钟前
🔥13年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·后端·面试
yuniko-n17 分钟前
【Java】关于容器选型:Deque、PriorityQueue、LinkedList
java·开发语言