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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Spring的PayloadValidatingInterceptor验证多个XSD架构相关的知识,希望对你有一定的参考价值。

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

这个片段将使Spring仅验证第二个模式,而不是第一个模式。我已经尝试创建多个PayloadValidatingInterceptors来添加super.addInterceptors(拦截器);但是它也没有用。我能够找到的唯一响应(使用Java而不是XML)来自2009年:

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

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

答案

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

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

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

这会收到一个XsdSchemaCollection,您需要实例化并实现2个anon方法,如下所示:

    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()方法返回一个Resources数组,您可以从中传递当前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()]);
}

以上是关于如何使用Spring的PayloadValidatingInterceptor验证多个XSD架构的主要内容,如果未能解决你的问题,请参考以下文章

Spring认证指南:了解如何使用 Spring 执行表单验证

如何将 Spring 与 JavaFX 一起使用?

如何使用 Spring 重新加载属性?

如何使用 Spring Security 管理 Spring Boot 中的会话?

如何使用带有多个过滤器和 Spring Security 的 Spring DelegatingFilterProxy?

Spring-batch:如何在 Spring Batch 中使用 skip 方法捕获异常消息?