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,除非维护遗留系统 ‌。
相关推荐
pqq的迷弟1 小时前
面试整理:HashMap\ConcurrentHashMap原来
java·面试·职场和发展
用户327980567071 小时前
JDK9+日志Xlog的使用方式
后端
夕除1 小时前
javaweb--16
java·状态模式
用户游民1 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
花月C1 小时前
Agent应用开发零基础入门:核心概念、环境配置与首次LLM调用
java·python
曹牧1 小时前
Java Web:DispatcherServlet
java·开发语言·前端
直奔標竿1 小时前
Java开发者AI转型第二十三课!Spring AI个人知识库实战(二):异步ETL流水线搭建与避坑指南
java·人工智能·spring boot·后端·spring
Lyyaoo.1 小时前
TreadLocal和TreadLocalMap
android·java·redis
会编程的土豆1 小时前
洛谷题单 入门1 顺序结构(go语言)
开发语言·后端·golang·洛谷