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,除非维护遗留系统 ‌。
相关推荐
Wang's Blog4 小时前
Java 接入Redis: 服务启动停止与后台运行配置
java·服务器·redis
此时不提桶,更待何时4 小时前
01-04-B-垃圾回收面试与生产事故实战
java·jvm·面试
GreenTea4 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
码事漫谈5 小时前
FDE:一个缩写,两种命运
后端
名字还没想好☜6 小时前
Go context.AfterFunc 实战(Go 1.21):context 一取消就自动跑清理,告别手写 goroutine 监听 Done
后端·golang·go
鹿角片ljp6 小时前
KV Cache 解析
java·算法
captain3766 小时前
网络原理(9)-数据链路层
java·网络协议·java-ee
惊讶的猫7 小时前
意图识别置信度和检索重排的分数
java
明月_清风7 小时前
为什么最近开始关注 JEV?几个实战案例告诉你答案
人工智能·后端