2013-01-17 83 views
2

我使用自旋微觀-WS(2.1)在Spring項目開發。Spring的PayloadValidatingInterceptor評估XML(uncorrect)無效

使用PayloadValidatingInterceptor,我們通過Spring Mock或soapUI發送的消息被評爲無效。

我們檢查了XSD幾次,我們相信,數據和模式是正確的。我使用springframework.xml-validator引擎和javax.xml.validation類在SpringJUnit4ClassRunner內部實現了兩個測試用例,以根據模式驗證WS之外的有效內容。在那裏他們是有效的。

有誰知道一個原因WS內部驗證的行爲與人工確認有什麼不同?

+0

一些試驗用不同的XSD配置後我發現,攔截器中的驗證在識別不合格屬性時存在問題。合格的人正在工作。 – steyze

回答

1

我也有PayloadValidatingInterceptor以及一些問題。我根據我讀的here創建了一個簡單的替代方案。有時攔截器無法按預期工作 - 使其基於StringReader而不是String - 解決了我的問題。也許這將有助於解決您的問題!


對細節的解決方案給在那裏,你可以用一個代理類這樣的替換攔截:

import java.io.StringReader; 
import java.io.StringWriter; 

import org.springframework.ws.client.WebServiceTransformerException; 
import org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor; 

import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

import org.springframework.ws.WebServiceMessage; 

public class PayloadValidatingInterceptorWithSourceFix extends 
     PayloadValidatingInterceptor { 

    @Override 
    protected Source getValidationRequestSource(WebServiceMessage request) { 
     return transformSourceToStreamSourceWithStringReader(request 
       .getPayloadSource()); 
    } 

    @Override 
    protected Source getValidationResponseSource(WebServiceMessage response) { 
     return transformSourceToStreamSourceWithStringReader(response 
       .getPayloadSource()); 
    } 

    Source transformSourceToStreamSourceWithStringReader(
      Source notValidatableSource) { 
     final Source source; 
     try { 
      Transformer transformer = TransformerFactory.newInstance() 
        .newTransformer(); 

      transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, 
        "yes"); 
      transformer.setOutputProperty(OutputKeys.INDENT, "no"); 
      StringWriter writer = new StringWriter(); 
      transformer.transform(notValidatableSource, 
        new StreamResult(writer)); 

      String transformed = writer.toString(); 
      StringReader reader = new StringReader(transformed); 
      source = new StreamSource(reader); 

     } catch (TransformerException transformerException) { 
      throw new WebServiceTransformerException(
        "Could not convert the source to a StreamSource with a StringReader", 
        transformerException); 
     } 

     return source; 
    } 
} 

,並使用它像

<bean id="payloadValidatingInterceptorWithSourceFix" 
    class="path.to.your.PayloadValidatingInterceptorWithSourceFix"> 
    <property name="schema" 
     value="file:WebContent/WEB-INF/schemas/account-balance-service.xsd" /> 
    <property name="validateRequest" value="true" /> 
    <property name="validateResponse" value="true" /> 
</bean> 
+0

謝謝。你拯救了我的一天。 ;)鏈接的博客作品中描述的實現。 – steyze

+0

太棒了!很高興它的工作( - : – evandongen

+0

也救了我的一天,一直在我的頭反對這個太久了。 – eis