繁体   English   中英

Spring-WS:自动wsdl故障生成/关联

[英]Spring-WS: Automatic wsdl fault generation/association

我在spring-ws中使用DynamicWsdl11Definition来生成wsdl规范。 最终,我得到的规范没有附加到wsdl操作的wsdl错误,因为我不知道如何自动将特定的wsdl / soap操作与特定的wsdl错误相关联。 我怎样才能做到这一点? 有什么方法可以将wsdl错误与XSD模式中的wsdl操作相关联?

这是我的XSD的一部分:

    <xs:element name="setContextRequest">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="usageContext" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="setContextResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

这是我的例外:

    <xs:element name="InvalidSessionException">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="InvalidSessionException" nillable="true" type="fault:InvalidSession"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

这是WSDL规范:

        <wsdl:operation name="setContext">
            <soap:operation soapAction=""/>
            <wsdl:input name="setContextRequest">
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="setContextResponse">
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>

我的问题是关于如何将故障与该操作最终相关联:

        <wsdl:operation name="setContext">
            <soap:operation soapAction=""/>
            <wsdl:input name="setContextRequest">
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="setContextResponse">
                <soap:body use="literal"/>
            </wsdl:output>
            <wsdl:fault name="invalidSession" type="InvalidSession"/>
        </wsdl:operation>

谢谢。

ps:我正在设置requestSuffix,responseSuffix和faultSuffix,因此也能够生成wsdl错误消息。

关于第一个问题,关于如何使sws:dynamic-wsdl生成故障元素,约定是使故障元素以“ Fault”结尾,因此,如果您具有“ MemberService”,则应具有“ MemberRequest”,“ xsd中的MemberResponse”和“ MemberFault”元素,这些元素将由Spring-WS组合在一起

<wsdl:portType name="MemberDetails">
  <wsdl:operation name="MemberDetails">
   <wsdl:input message="tns:MemberDetailsRequest" name="MemberDetailsRequest"></wsdl:input>
   <wsdl:output message="tns:MemberDetailsResponse" name="MemberDetailsResponse"></wsdl:output>
   <wsdl:fault message="tns:MemberDetailsFault" name="MemberDetailsFault"></wsdl:fault>
 </wsdl:operation>
</wsdl:portType>

关于第二个问题,如何使Spring-WS填充此故障元素,我编写了一个自定义的SoapFaultExceptionResolver,它查找我特定类型的异常,并按标签填充故障元素标签。 有点骇人听闻,但我没有看到其他方式。

您应该使用不同的requestSuffix responseSuffix和faultSuffix安装相同的名称:

    <xs:element name="setContextRequest">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="usageContext" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="setContextResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="setContextException">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="InvalidSessionException" nillable="true" type="fault:InvalidSession"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

我没有使用动态WSDL生成来查看内联故障。

我虽然使用了EndpointExceptionResolver。 这将创建一个SOAP-FAULT消息。 您可以这样定义:

@Bean
public EndpointExceptionResolver exceptionResolver() {
    SoapFaultDefinition defaultFault = new SoapFaultDefinition();
    defaultFault.setFaultCode(SoapFaultDefinition.SERVER);

    Properties mappings = new Properties();
    mappings.put("com.sun.xml.wss.impl.WssSoapFaultException", "CLIENT,Authentication failed");
    mappings.put("org.springframework.ws.soap.security.xwss.XwsSecurityValidationException", "CLIENT,Authentication failed");

    SoapFaultMappingExceptionResolver resolver = new SoapFaultMappingExceptionResolver();
    resolver.setDefaultFault(defaultFault);
    resolver.setExceptionMappings(mappings);

    return resolver;
}

您可以将此异常解析器注入到其中一个拦截器中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM