localPart和payloadRoot是否依赖于wsdl中的地址位置和操作名称?

时间:2017-04-09 11:37:33

标签: java spring soap spring-ws

我试图通过spring-ws创建SOAP服务。我预先编写了第三方wsdl,并且我通过jaxb插件从wsdl(合同优先方法)生成代码。

当我构建项目时,spring会在host/my-app-context/ws/notification上成功部署它。

问题 - 当我通过SOAP UI发出请求时,我看到No endpoint mapping found for [SaajSoapMessage {http://other.company.kz/service/}SendMessage]

注意1. http://other.company.kz/service给定wsdl中的第三方命名空间。 我部署ws的主机与之相同

注意2. wsdl中唯一的操作是<wsdl:operation name="SendMessage">

我的端点中的payloadRoot和localPart配置是否与第三方软件包和操作名称相同,或者它们应与我的hostname / deploy-url相同?我试过{{1} } @PayloadRoot(namespace = NAMESPACE_URI, localPart = "sendMessage")是我服务的地址位置(来自wsdl),我也尝试过来自wsdl namespace(other.company.kz)的NAMESPACE_URI,但两者都失败了。

我的配置代码类似于

NAMESPACE_URI

引自wsdl

@Bean
    public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        return new ServletRegistrationBean(servlet, "/ws/*");
    }

  @Bean(name = "notification")
    public Wsdl11Definition defaultWsdl11Definition() {
        SimpleWsdl11Definition wsdl11Definition = new SimpleWsdl11Definition();
        wsdl11Definition.setWsdl(new ClassPathResource("notification.wsdl"));
        return wsdl11Definition;
    }

我的终点

<wsdl:binding name="SomeBinding" type="tns0:bla-bla-bla">
        <binding transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="SendMessage">
            <operation soapAction=""/>
            <wsdl:input name="SendMessageRequest">
                <body use="literal"/>
            </wsdl:input>
            <wsdl:output name="SendMessageResponse">
                <body use="literal"/>
            </wsdl:output>
            <wsdl:fault name="sendMessageFault">
                <fault name="sendMessageFault" namespace="" use="literal"/>
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="SomeService">
        <wsdl:port binding="tns0:SomeBinding" name="SomePort">
            <address location="http://myhost/my-app-context/ws/notification"/>
        </wsdl:port>
    </wsdl:service>

1 个答案:

答案 0 :(得分:0)

在实现ws-server时遇到了类似的问题。在我的情况下,当没有使用ws-security时, @PayloadRoot 过去工作正常。

当我应用ws-security时,我曾经找不到端点,我的解决方案是依赖@SoapAction

我当时的理解是:

  • 标题不会被加密,所以soapaction是标题将不加密
  • 有效负载拦截器似乎失败了,因为它可能在过程中过早(在解密消息之前)