在Spring-WS中注册端点

时间:2016-05-13 07:46:03

标签: spring web-services spring-ws

我们正在尝试在此处构建一个Web服务。我们希望该服务在notifySmsDeliveryReceipt处可用。将调用的操作是import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; 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; import org.springframework.ws.soap.addressing.server.annotation.Action; import java.io.IOException; import java.io.StringReader; @Endpoint public class SmsNotificationService { @Action("http://axis2/services/SmsNotificationService") @PayloadRoot(localPart = "notifySmsDeliveryReceipt", namespace = "http://www.csapi.org/schema/parlayx/sms/notification/v3_1/local") @ResponsePayload public Element handleNotifyReceipt(@RequestPayload Element root) { String correlator = root.getChild("correlator").getValue(); Element deliveryStatusElement = root.getChild("deliveryStatus"); String address = deliveryStatusElement.getChild("address").getValue(); String deliveryStatus = deliveryStatusElement.getChild("deliveryStatus").getValue(); System.out.println("correlator: " + correlator); System.out.println("address: " + address); System.out.println("deliveryStatus: " + deliveryStatus); String s="<soapenv:Envelope xmlns:soapenv=\u2018http://schemas.xmlsoap.org/soap/envelope/\u2019 xmlns:loc=\u2018http://www.csapi.org/schema/parlayx/sms/notification/v3_1/local\u2019>\n"+ "<soapenv:Header/>\n"+ "<soapenv:Body>\n"+ "<loc:notifySmsDeliveryReceiptResponse/>\n"+ "</soapenv:Body>\n"+ "</soapenv:Envelope>"; SAXBuilder sxBuild = new SAXBuilder(); Document doc; Element returnRoot = null; try { doc = sxBuild.build(new StringReader(s)); returnRoot = doc.getRootElement(); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return returnRoot; } } 。以下是Spring的终点。

<soapenv:Envelope xmlns:soapenv=‘http://schemas.xmlsoap.org/soap/envelope/’ xmlns:v3=‘http://www.csapi.org/schema/parlayx/common/v3_1’ xmlns:loc=‘http://www.csapi.org/schema/parlayx/sms/notification/v3_1/local’>
  <soapenv:Header>
    <v3:NotifySOAPHeader>
      <spId>600002</spId>
    </v3:NotifySOAPHeader>
  </soapenv:Header>
  <soapenv:Body>
    <loc:notifySmsDeliveryReceipt>
      <loc:correlator>123</loc:correlator>
      <loc:deliveryStatus>
        <address>tel:+86123</address>
        <deliveryStatus>DeliveredToTerminal</deliveryStatus>
      </loc:deliveryStatus>
    </loc:notifySmsDeliveryReceipt>
  </soapenv:Body>
</soapenv:Envelope>

客户端将使用此XML调用服务。

<soapenv:Envelope xmlns:soapenv=‘http://schemas.xmlsoap.org/soap/envelope/’ xmlns:loc=‘http://www.csapi.org/schema/parlayx/sms/notification/v3_1/local’>
  <soapenv:Header/>
  <soapenv:Body>
    <loc:notifySmsDeliveryReceiptResponse/>
  </soapenv:Body>
</soapenv:Envelope>

服务需要返回此XML:

`xxx.xx.xxx.x - - [13/May/2016:13:43:43 +0630] "POST /axis2/services/SmsNotificationService​ HTTP/1.1" 404 -`

Tomcat的访问日志注册了一个服务调用,但远程调用者收到了错误:

13-May-2016 13:42:32.459 INFO [http-nio-8088-exec-6] org.springframework.ws.soap.addressing.server.AbstractAddressingEndpointMapping.afterPropertiesSet Supporting [WS-Addressing August 2004, WS-Addressing 1.0]
13-May-2016 13:42:32.487 INFO [http-nio-8088-exec-6] org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2e8571ab: defining beans [org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping#0,org.springframework.ws.soap.server.endpoint.mapping.SoapActionAnnotationMethodEndpointMapping#0,org.springframework.ws.soap.addressing.server.AnnotationActionEndpointMapping#0,org.springframework.ws.server.endpoint.adapter.method.dom.DomPayloadMethodProcessor#0,org.springframework.ws.server.endpoint.adapter.method.SourcePayloadMethodProcessor#0,org.springframework.ws.server.endpoint.adapter.method.dom.Dom4jPayloadMethodProcessor#0,org.springframework.ws.server.endpoint.adapter.method.jaxb.XmlRootElementPayloadMethodProcessor#0,org.springframework.ws.server.endpoint.adapter.method.jaxb.JaxbElementPayloadMethodProcessor#0,org.springframework.ws.server.endpoint.adapter.method.dom.XomPayloadMethodProcessor#0,org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter#0,org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver#0,org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver#0]; root of factory hierarchy
13-May-2016 13:42:32.764 INFO [http-nio-8088-exec-6] org.springframework.ws.soap.saaj.SaajSoapMessageFactory.afterPropertiesSet Creating SAAJ 1.3 MessageFactory with SOAP 1.1 Protocol
13-May-2016 13:42:32.784 INFO [http-nio-8088-exec-6] org.springframework.web.servlet.FrameworkServlet.initServletBean FrameworkServlet 'spring-ws': initialization completed in 2448 ms
13-May-2016 13:43:43.774 WARNING [http-nio-8088-exec-8] org.springframework.ws.server.MessageDispatcher.dispatch No endpoint mapping found for [SaajSoapMessage {http://www.csapi.org/schema/parlayx/sms/notification/v3_1/local}notifySmsDeliveryReceipt]

Catalina的日志显示以下内容:

{{1}}

问题可能在于端点没有被Spring-WS注册。

有没有人知道如何使用Spring-WS注册端点并声明操作?

1 个答案:

答案 0 :(得分:3)

如果您使用的是Spring WS,那么您应该定义

web.xml文件中的servlet映射

<servlet>  
    <servlet-name>webservices</servlet-name>  
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>  
    <init-param>  
        <param-name>transformWsdlLocations</param-name>  
        <param-value>true</param-value>  
    </init-param>  
    <init-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath:springws-config.xml</param-value>  
    </init-param>  
    <load-on-startup>1</load-on-startup>  
</servlet>
<servlet-mapping>  
        <servlet-name>webservices</servlet-name>  
        <url-pattern>/axis2/services/*</url-pattern>  
</servlet-mapping>

MessageDispatcherServlet扫描类路径中Wsdl11Definition的所有bean并发布它们。 然后,您需要创建一个弹簧配置文件:

springws-config.xml中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:mvc="http://www.springframework.org/schema/mvc" 
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:sws="http://www.springframework.org/schema/web-services"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/web-services  
            http://www.springframework.org/schema/web-services/web-services-2.0.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="some.package.SmsNotificationService"/>
    <sws:annotation-driven />
    <!-- you can use static-wsdl OR dynamic-wsdl here -->
</beans>