【问题标题】:How to validate multiple XSD Schemas with Spring's PayloadValidatingInterceptor如何使用 Spring 的 PayloadValidatingInterceptor 验证多个 XSD 模式
【发布时间】:2017-09-20 19:41:23
【问题描述】:

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

这个 sn-p 将使 Spring 仅验证第二个模式,而不是第一个。我尝试创建多个 PayloadValidatingInterceptor 以使用 super.addInterceptors(interceptors); 添加它们,但它也不起作用。我能找到的唯一响应(使用 Java 而不是 XML)是从 2009 年开始的:

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

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

【问题讨论】:

  • 您是否尝试过使用 setXsdSchemaCollection 而不是 setXsdSchema?如果是,那么出了什么问题?如果没有,那为什么不呢?
  • 我试过了,还是不行。我也找不到使用 setXsdSchema 的实现示例。该方法要求您实现 XsdSchema[] getXsdSchemas() 和 XmlValidator createValidator(),但我不知道如何实现 createValidator() 方法。简单地返回 null 会使应用程序无法使用,并且无法实例化 XmlValidtor。

标签: java spring-boot xsd wsdl spring-ws


【解决方案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()]);
}

【讨论】:

  • 在这种情况下,所有 3 个方案都属于一个请求?知道如何处理多个请求
【解决方案2】:

如果您将所有 xsd 集中在 1 个文件中(将所有 xsd 导入 1 个文件中),您可以使用 schemaCollection:

public void addInterceptors(List<EndpointInterceptor> interceptors) {
PayloadValidatingInterceptor validatingInterceptor = new PayloadValidatingInterceptor();
validatingInterceptor.setValidateRequest(true);
validatingInterceptor.setValidateResponse(true);

//use setXsdSchemaCollection instead of setXsdSchema
validatingInterceptor.setXsdSchemaCollection(getFirstSchema());

interceptors.add(validatingInterceptor);
super.addInterceptors(interceptors);

}

【讨论】:

    猜你喜欢
    • 2016-12-19
    • 2014-02-26
    • 1970-01-01
    • 2011-02-07
    • 2014-07-13
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多