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,除非维护遗留系统 ‌。
相关推荐
jay神6 分钟前
【计算机毕业设计】基于Spring Boot的宠物领养管理系统
java·spring boot·后端·vue·毕业设计·宠物
cfm_291412 分钟前
5种Java并发同步工具全解
java
十五喵源码网16 分钟前
基于SpringBoot2+vue2的健身房管理系统
java·毕业设计·springboot·论文笔记
2601_9620566018 分钟前
可造成敏感信息泄露!Spring Boot之Actuator信息泄露漏洞三种利用方式总结
java·spring boot·后端
码视野26 分钟前
基于 Spring Boot + Vue3 的【城市道路地下空洞塌陷微动传感监测与路面脱空沉降预警中台】设计与实现(含PRD/三端高保真源码/大屏)
vue.js·spring boot·后端
garmin Chen1 小时前
redis面试题
java·数据库·redis·缓存
chen<>2 小时前
C++ 六种 memory_order:从原子性到线程间可见性.md
java·linux·开发语言·c++
十年Java程序媛2 小时前
SpringBoot3 + JDK17 实战复盘:HikariCP 连接耗尽,虚拟线程场景额外注意事项
java·spring boot
二十雨辰2 小时前
[Java]-JVM面试题
java·开发语言·jvm
cfm_29142 小时前
ConcurrentHashMap 线程安全机制与 JDK 1.8 演进
java·开发语言·安全