📜  Spring WS-写作服务器(1)

📅  最后修改于: 2023-12-03 15:20:13.526000             🧑  作者: Mango

Spring WS-写作服务器

Spring WS是一个基于Spring框架的Web服务框架,旨在支持SOAP协议。它提供了一种简洁的编程模型来创建基于SOAP的Web服务,同时尽可能地减少样板代码。

写作服务器

写作服务器是指一个支持SOAP协议的Web服务,它接收SOAP请求并返回SOAP响应。在Spring WS中,可以通过简单的注解将一个Java类转换为SOAP Web服务。

创建一个写作服务器

要创建一个写作服务器,需要在Spring配置文件中定义一个MessageDispatcherServlet,并将消息处理器映射到此servlet中。在Web.xml文件中添加以下配置:

<servlet>
  <servlet-name>messageDispatcherServlet</servlet-name>
  <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-ws-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>messageDispatcherServlet</servlet-name>
  <url-pattern>/ws/*</url-pattern>
</servlet-mapping>

在Spring配置文件中添加以下配置,用于映射请求到处理器:

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
  <property name="contextPaths">
    <list>
      <value>com.example.courses</value>
    </list>
  </property>
</bean>

<bean id="endpointMapping"
      class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
  <property name="interceptors">
    <list>
      <ref bean="validatingInterceptor"/>
    </list>
  </property>
  <property name="defaultEndpoint" ref="courseDetailsEndpoint"/>
</bean>

<bean id="validatingInterceptor" class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
  <property name="schema" value="/WEB-INF/schemas/Courses.xsd"/>
  <property name="validateRequest" value="true"/>
  <property name="validateResponse" value="true"/>
</bean>

<bean id="courseDetailsEndpoint" class="com.example.courses.CourseDetailsEndpoint"/>
实现一个写作服务器

处理器是Java类,负责处理SOAP请求并返回SOAP响应。在处理器类上使用注解@Endpoint@PayloadRoot定义请求的命名空间和本地名,然后在方法上使用注解@ResponsePayload标记返回值。

@Endpoint
public class CourseDetailsEndpoint {

    private static final String NAMESPACE_URI = "http://www.example.com/courses";

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "GetCourseDetailsRequest")
    @ResponsePayload
    public GetCourseDetailsResponse getCourseDetails(@RequestPayload GetCourseDetailsRequest request) {
        GetCourseDetailsResponse response = new GetCourseDetailsResponse();
        CourseDetails courseDetails = new CourseDetails();
        courseDetails.setId(request.getId());
        courseDetails.setName("Spring WS");
        courseDetails.setDescription("Spring Web Services");
        response.setCourseDetails(courseDetails);
        return response;
    }
}

在这个例子中,CourseDetailsEndpoint映射了一个名为GetCourseDetailsRequest的请求,定义在命名空间http://www.example.com/courses下。请求包含一个名为id的参数,响应包含一个名为courseDetails的对象,它具有IDid,名称Spring WS和描述Spring Web Services

总结

Spring WS提供了一种简明的编程模型,用于创建SOAP Web服务。通过使用Spring的注解和OXM支持,可以轻松地在Java类之间转换SOAP消息。它还提供了丰富的扩展点,例如验证SOAP请求和响应,以及处理传入的SOAP头等。