2011-07-26 47 views
2

我在spring-ws中使用DynamicWsdl11Definition來生成我的wsdl規範。最終,我得到一個沒有附加wsdl操作的wsdl錯誤的規範,因爲我不知道如何自動將特定的wsdl/soap操作與特定的wsdl錯誤聯繫起來。我怎樣才能做到這一點?有什麼辦法可以在XSD架構中將wsdl錯誤與wsdl操作相關聯嗎?Spring-WS:自動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

故障是WSDL合同的一部分。我個人認爲讓他們在合同中上市會更好。請在上面找到一個示例方法。謝謝! – Aleyna

+0

Spring不關心代碼Mark so add throws如果我在這裏得到它,語句將不會執行任何操作。我想我需要對模式本身進行一些更改,以便它會像生成wsdl操作一樣生成wsdl錯誤,我不知道該如何操作。我甚至不知道Spring是否支持 – Aleyna

回答

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

對於第一個問題,關於如何獲取sws:dynamic-wsdl來生成故障元素,約定是將故障元素以「Fault」結尾,因此如果您有「MemberService」,則有一個「 MemberRequest」,‘MemberResponse’和‘你的XSD 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,它查找我的特定類型的異常並通過標記填充故障元素標記。有點冒險,但我沒有看到任何其他方式。

+0

謝謝Biju。我嘗試設置requestSuffix,responseSuffix和faultSuffix,但由於某種原因沒有通過。然後我試着重命名我的異常後綴...故障,仍然沒有改變。我會進一步調查,讓大家都知道。 – Aleyna

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>