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

fac*_*dop 0 java xsd wsdl spring-ws spring-boot

我有一个带有多个 XSD 模式的 Spring Boot 项目(我使用的是 Spring-WS)。

如果我使用 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);
}
Run Code Online (Sandbox Code Playgroud)

此代码段将使 Spring 仅验证第二个模式,而不是第一个。我尝试创建多个 PayloadValidatingInterceptors 以使用 super.addInterceptors(interceptors); 添加它们,但它也不起作用。我能找到的唯一响应(使用 Java 而不是 XML)来自 2009 年:

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

有谁知道基于 Java 的解决方案来验证来自同一项目中多个 XSD 的请求和响应?

fac*_*dop 5

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

为了验证多个模式,这就是我所做的:

我最终使用了validatingInterceptor.setXsdSchemaCollection()而不是validatingInterceptor.setXsdSchema()。

这将接收一个 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;
        }
    };
Run Code Online (Sandbox Code Playgroud)

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()]);
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,所有 3 个方案都属于一个请求?知道如何处理多个请求 (3认同)