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