2017-09-20 89 views
0

我有一個帶有多個XSD Schema的Spring Boot項目(我正在使用Spring-WS)。如何使用Spring的PayloadValidatingInterceptor驗證多個XSD Schemas

如果我使用Spring的PayloadValidatingInterceptor來驗證請求和響應,它只適用於最新的設置模式。

例如:

public void addInterceptors(List<EndpointInterceptor> interceptors) { 
    PayloadValidatingInterceptor validatingInterceptor = new PayloadValidatingInterceptor(); 
    validatingInterceptor.setValidateRequest(true); 
    validatingInterceptor.setValidateResponse(true); 
    validatingInterceptor.setXsdSchema(getFirstSchema()); 
    validatingInterceptor.setXsdSchema(getSecondSchema()); 
    interceptors.add(validatingInterceptor); 
    super.addInterceptors(interceptors); 
} 

這個片段將使得春節驗證只有第二架構,而不是第一個。我試着創建多個PayloadValidatingInterceptors來添加它們與super.addInterceptors(攔截器);但它也沒有工作。唯一的迴應,我能找到(與Java而不是XML),是從2009年:

https://jira.spring.io/browse/SWS-481

有誰知道一個基於Java的解決方案,以驗證在同一項目從多個XSD的請求和響應?

+0

您是否嘗試過使用setXsdSchemaCollection代替setXsdSchema?如果是,那麼出了什麼問題?如果不是,那爲什麼不呢? –

+0

我試過了,但它不起作用。我無法找到使用setXsdSchema的實現示例。該方法要求您實現XsdSchema [] getXsdSchemas()和XmlValidator createValidator(),但我不知道如何實現createValidator()方法。簡單地返回空使得應用程序不可用,並且XmlValidtor不能被實例化。 – facundop

回答

1

發佈解決方案以備將來參考,因爲我無法在互聯網上找到一個示例。

爲了驗證多種模式,這是我做的:

validatingInterceptor.setXsdSchema()的相反,我結束了使用validatingInterceptor.setXsdSchemaCollection()。

此接收XsdSchemaCollection,您需要實例化和執行2層匿名的方法,是這樣的:

XsdSchemaCollection schemaCollection = new XsdSchemaCollection() { 

     @Override 
     public XsdSchema[] getXsdSchemas() { 
      return null; 
     } 

     @Override 
     public XmlValidator createValidator() { 
      try { 
       XmlValidator xmlValidator = XmlValidatorFactory.createValidator(getSchemas(), "http://www.w3.org/2001/XMLSchema"); 

       return xmlValidator; 
      } catch (IOException e) { 
       logger.error(e.getLocalizedMessage()); 
      } 
      return null; 
     } 
    }; 

的getSchemas()方法返回資源的從其中通過的電流的XSD驗證的數組:

public Resource[] getSchemas() { 
    List<Resource> schemaResources = new ArrayList<>(); 
    schemaResources.add(new ClassPathResource("firstService.xsd")); 
    schemaResources.add(new ClassPathResource("secondService.xsd")); 
    schemaResources.add(new ClassPathResource("thirdService.xsd")); 
    return schemaResources.toArray(new Resource[schemaResources.size()]); 
}