Spring WS(SOAP)在Java 17中的兼容性及项目构建方法咨询
Spring WS与Java 17相关问题解答
1. Spring WS是否支持Java 17?
Spring WS 4.0及以上版本完全支持Java 17,可在Java 17环境中正常使用:
- 旧版本(如3.x系列)最高仅兼容Java 11,无法在Java 17环境中运行;
- Spring WS 4.x依赖的Spring Framework 6.x本身为Java 17+设计,二者适配性良好。
2. 基于Spring WS在Java 17环境下构建SOAP服务项目步骤
步骤1:添加依赖(以Maven为例)
Java 17移除了JAXB模块,需手动引入相关依赖,同时添加Spring WS核心依赖:
<dependencies> <!-- Spring WS核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> <version>3.2.0</version> <!-- 对应Spring WS 4.x版本 --> </dependency> <!-- Java 17需手动引入JAXB相关依赖 --> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>3.0.2</version> </dependency> </dependencies> <build> <plugins> <!-- JAXB插件:从XSD生成Java实体类 --> <plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.15.1</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <schemaDirectory>${project.basedir}/src/main/resources/schemas</schemaDirectory> <generatePackage>com.example.soap.model</generatePackage> </configuration> </plugin> </plugins> </build>
步骤2:定义SOAP契约(XSD Schema)
在src/main/resources/schemas目录下创建XSD文件(如customer.xsd),定义请求响应的数据结构:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://example.com/customer" targetNamespace="http://example.com/customer" elementFormDefault="qualified"> <xs:element name="getCustomerRequest"> <xs:complexType> <xs:sequence> <xs:element name="customerId" type="xs:int"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getCustomerResponse"> <xs:complexType> <xs:sequence> <xs:element name="customer" type="tns:customer"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="customer"> <xs:sequence> <xs:element name="id" type="xs:int"/> <xs:element name="name" type="xs:string"/> <xs:element name="email" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema>
步骤3:生成Java实体类
执行Maven命令mvn clean install,插件会自动根据XSD生成对应Java类到指定包路径下。
步骤4:创建SOAP端点(Endpoint)
编写处理SOAP请求的端点类,使用Spring WS注解绑定请求:
package com.example.soap.endpoint; import com.example.soap.model.GetCustomerRequest; import com.example.soap.model.GetCustomerResponse; import com.example.soap.model.Customer; import org.springframework.ws.server.endpoint.annotation.Endpoint; import org.springframework.ws.server.endpoint.annotation.PayloadRoot; import org.springframework.ws.server.endpoint.annotation.RequestPayload; import org.springframework.ws.server.endpoint.annotation.ResponsePayload; @Endpoint public class CustomerEndpoint { private static final String NAMESPACE_URI = "http://example.com/customer"; @PayloadRoot(namespace = NAMESPACE_URI, localPart = "getCustomerRequest") @ResponsePayload public GetCustomerResponse getCustomer(@RequestPayload GetCustomerRequest request) { GetCustomerResponse response = new GetCustomerResponse(); Customer customer = new Customer(); customer.setId(request.getCustomerId()); customer.setName("John Doe"); customer.setEmail("john@example.com"); response.setCustomer(customer); return response; } }
步骤5:配置Spring WS
创建配置类,配置消息调度器和WSDL定义:
package com.example.soap.config; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.ws.config.annotation.EnableWs; import org.springframework.ws.config.annotation.WsConfigurerAdapter; import org.springframework.ws.transport.http.MessageDispatcherServlet; import org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition; import org.springframework.xml.xsd.SimpleXsdSchema; import org.springframework.xml.xsd.XsdSchema; @EnableWs @Configuration public class WebServiceConfig extends WsConfigurerAdapter { @Bean public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext applicationContext) { MessageDispatcherServlet servlet = new MessageDispatcherServlet(); servlet.setApplicationContext(applicationContext); servlet.setTransformWsdlLocations(true); return new ServletRegistrationBean<>(servlet, "/ws/*"); } @Bean(name = "customers") public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema customerSchema) { DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition(); wsdl11Definition.setPortTypeName("CustomerPort"); wsdl11Definition.setLocationUri("/ws"); wsdl11Definition.setTargetNamespace("http://example.com/customer"); wsdl11Definition.setSchema(customerSchema); return wsdl11Definition; } @Bean public XsdSchema customerSchema() { return new SimpleXsdSchema(new ClassPathResource("schemas/customer.xsd")); } }
步骤6:测试SOAP服务
启动项目后,可通过http://localhost:8080/ws/customers.wsdl访问WSDL文档,使用SoapUI或Postman发送以下SOAP请求验证服务:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cus="http://example.com/customer"> <soapenv:Header/> <soapenv:Body> <cus:getCustomerRequest> <cus:customerId>1</cus:customerId> </cus:getCustomerRequest> </soapenv:Body> </soapenv:Envelope>
内容的提问来源于stack exchange,提问作者Ali Baizhanov
相关产品推荐
相关产品推荐

