📜  Spring WS-第一个应用程序(1)

📅  最后修改于: 2023-12-03 14:47:34.059000             🧑  作者: Mango

Spring WS-第一个应用程序

Spring Web Services (Spring-WS) 是一个开源框架,旨在支持为 SOAP Web Services 创建基于合同的 Web Services。

本文将介绍如何编写 Spring-WS 的第一个应用程序。

环境要求
  • Java 8
  • Spring Framework 5.x
  • Spring-WS 3.x
  • Maven 3.x 或 Gradle 4.x
创建项目

第一步是创建一个 Maven 或 Gradle 项目并添加 Spring-WS 依赖。

Maven
<dependency>
    <groupId>org.springframework.ws</groupId>
    <artifactId>spring-ws-core</artifactId>
    <version>3.0.8.RELEASE</version>
</dependency>
Gradle
compile group: 'org.springframework.ws', name: 'spring-ws-core', version: '3.0.8.RELEASE'
创建 Endpoint

接下来,我们需要编写一个 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-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 配置了 PayloadRootAnnotationMethodEndpointMappingDefaultMethodEndpointAdapter

最后,我们还添加了 PayloadValidatingInterceptor Bean,以验证请求和响应消息与 schema 是否一致。

测试 Endpoint

最后,我们需要编写一个简单的客户端来测试我们的 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。