Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringWS:自动wsdl错误生成/关联_Java_Spring_Soap_Wsdl_Spring Ws - Fatal编程技术网

Java SpringWS:自动wsdl错误生成/关联

Java SpringWS:自动wsdl错误生成/关联,java,spring,soap,wsdl,spring-ws,Java,Spring,Soap,Wsdl,Spring Ws,我在SpringWS中使用DynamicWSDL11定义来生成我的wsdl规范。最终,我得到的规范没有附加到wsdl操作的wsdl错误,因为我不知道如何将特定wsdl/soap操作与特定wsdl错误自动关联。我该怎么做?有没有办法将wsdl错误与XSD模式中的wsdl操作相关联 以下是我的XSD中的一部分: <xs:element name="setContextRequest"> <xs:complexType> <

我在SpringWS中使用DynamicWSDL11定义来生成我的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错误消息。

我没有使用动态wsdl生成查看内联错误的生成

不过我使用了EndpointExceptionResolver。这将创建一条SOAP错误消息。您可以这样定义一个:

@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;
}

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

对于您的第一个问题,关于如何获取sws:dynamic wsdl来生成fault元素,约定是让fault元素以“fault”结尾,因此如果您有“MemberService”,那么就有一个“MemberRequest”、“MemberResponse”和“MemberFault”xsd中的元素,这些元素将由SpringWS组合在一起

<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>


关于第二个问题,如何让SpringWS填充这个fault元素,我已经编写了一个定制的SoapFaultExceptionResolver,它查找我的特定类型的异常并逐个标记填充fault元素。有点老套,但我没有看到任何其他方法。

您应该安装具有不同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契约的一部分。我个人认为最好把它们列在合同中。请在上面找到一个示例方法。谢谢Spring不关心代码标记,所以如果我在这里得到它,添加throws语句将不会起任何作用。我想我需要对模式本身做一些更改,这样它就会像对待wsdl操作一样生成wsdl错误。我不知道如何做到这一点。我甚至不知道春天是否支持这一点。谢谢比丘。我尝试设置requestSuffix、responseSuffix和faultSuffix,但由于某种原因没有成功。然后我尝试将我的异常重命名为后缀…Fault,但仍然没有任何更改。我会进一步调查,并在这里告诉大家。