📅  最后修改于: 2023-12-03 14:47:34.059000             🧑  作者: Mango
Spring Web Services (Spring-WS) 是一个开源框架,旨在支持为 SOAP Web Services 创建基于合同的 Web Services。
本文将介绍如何编写 Spring-WS 的第一个应用程序。
第一步是创建一个 Maven 或 Gradle 项目并添加 Spring-WS 依赖。
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>3.0.8.RELEASE</version>
</dependency>
compile group: 'org.springframework.ws', name: 'spring-ws-core', version: '3.0.8.RELEASE'
接下来,我们需要编写一个 Endpoint 类来处理来自客户端的请求并返回响应。
在本例中,我们将定义一个名为 StudentEndpoint 的 Endpoint,用于处理来自客户端的获取学生信息请求。
@Endpoint
public class StudentEndpoint {
private static final String NAMESPACE_URI = "http://www.example.org/student";
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getStudentRequest")
@ResponsePayload
public GetStudentResponse getStudent(@RequestPayload GetStudentRequest request) {
GetStudentResponse response = new GetStudentResponse();
Student student = new Student();
student.setName("John Doe");
student.setAge(25);
response.setStudent(student);
return response;
}
}
在上述代码中,我们首先使用 @Endpoint
注解将此类标记为 Spring-WS Endpoint,然后定义了一个命名空间 URI 和一个 local part,用于处理客户端的 getStudentRequest
请求。
在此 Endpoint 中,我们使用 @PayloadRoot
注解来指定要处理的请求的名称空间和本地部分。注意,此注释还要求本地部分必须匹配请求方法的参数类型。
@ResponsePayload
注解必须用于请求处理方法,以指定方法返回值应该成为响应的有效负载。
在此方法中,我们简单地创建一个 Student 对象并将其添加到 GetStudentResponse 对象中。
要使 Spring-WS 工作,我们需要配置 Spring 上下文和 Spring-WS 消息工厂。
以下是 Spring-WS 消息工厂和注入我们创建的 StudentEndpoint 的 Spring 配置。它应该位于 spring-ws-servlet.xml
文件中。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:sws="http://www.springframework.org/schema/web-services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<sws:annotation-driven/>
<sws:dynamic-wsdl id="student"
portTypeName="Student"
locationUri="/ws"
targetNamespace="http://www.example.org/student">
<sws:xsd location="/xsd/student.xsd"/>
</sws:dynamic-wsdl>
<context:component-scan base-package="com.example.student"/>
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>
<bean id="studentMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="com.example.student"/>
</bean>
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
<property name="interceptors">
<list>
<ref bean="validatingInterceptor"/>
</list>
</property>
</bean>
<bean id="validatingInterceptor" class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
<property name="schema" value="/xsd/student.xsd"/>
<property name="validateRequest" value="true"/>
<property name="validateResponse" value="true"/>
</bean>
<bean class="org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter">
<property name="methodArgumentResolvers">
<list>
<bean class="org.springframework.ws.server.endpoint.adapter.method.dom.DomPayloadMethodProcessor"/>
</list>
</property>
<property name="methodReturnValueHandlers">
<list>
<bean class="org.springframework.ws.server.endpoint.adapter.method.dom.DomPayloadMethodProcessor"/>
</list>
</property>
</bean>
</beans>
在上面的配置中,我们定义一个 dynamic-wsdl
元素,它定义了一个名称为 student 的动态 WSDL,并指定了 PortType 名称、位置 URI 和目标命名空间。
注意,我们还定义了一个 studentMarshaller
Bean,它负责将 Student 对象转换为 XML。
我们还为 Endpoint 配置了 PayloadRootAnnotationMethodEndpointMapping
和 DefaultMethodEndpointAdapter
。
最后,我们还添加了 PayloadValidatingInterceptor
Bean,以验证请求和响应消息与 schema 是否一致。
最后,我们需要编写一个简单的客户端来测试我们的 StudentEndpoint。
public class Application {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-ws-servlet.xml");
StudentClient studentClient = context.getBean(StudentClient.class);
GetStudentRequest getStudentRequest = new GetStudentRequest();
getStudentRequest.setName("John");
GetStudentResponse getStudentResponse = studentClient.getStudent(getStudentRequest);
System.out.println("Name: " + getStudentResponse.getStudent().getName());
System.out.println("Age: " + getStudentResponse.getStudent().getAge());
}
}
在上述代码中,我们从 Spring 上下文中获取 StudentClient bean,并使用其 getStudent() 方法发送 GetStudentRequest。我们然后显示 Student 对象的名称和年龄。
本文介绍了如何创建 Spring-WS 的第一个应用程序。我们首先定义了一个名为 StudentEndpoint 的 Endpoint 类,用于处理客户端响应。然后我们配置了 Spring 上下文和 Spring-WS 消息工厂。最后,我们编写了一个简单的客户端来测试 StudentEndpoint。
希望这篇文章能够帮助你开始使用 Spring-WS。