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

时间:2011-07-26 23:03:41

标签: java spring soap wsdl spring-ws

我在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错误消息。

3 个答案:

答案 0 :(得分:3)

关于如何获取sws:dynamic-wsdl生成fault元素的第一个问题,惯例是让fault元素以“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填充这个fault元素,我编写了一个自定义的SoapFaultExceptionResolver,它查找我的特定类型的异常并按标记填充fault元素标记。有点hacky,但我没有看到任何其他方式。

答案 1 :(得分:0)

我没有通过使用动态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;
}

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

答案 2 :(得分:0)

您应该使用不同的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>