Spring WebService的两种主流实现方式及说明
作者:曹牧
文章介绍了Spring Web Services(Spring-WS)和Spring Boot + Apache CXF两种主流的Web服务实现方式,Spring-WS采用ContractFirst方式,适合企业级、高可维护性的SOAP服务;Spring Boot + CXF采用ContractLast方式,开发更快,适合快速原型或内部系统集成
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,除非维护遗留系统 。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
