如何使用Spring的PayloadValidatingInterceptor验证多个XSD Schemas

问题描述:

我有一个带有多个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

发布解决方案以备将来参考,因为我无法在互联网上找到一个示例。

为了验证多种模式,这是我做的:

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()]); 
}