如何使用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的请求和响应?
答
发布解决方案以备将来参考,因为我无法在互联网上找到一个示例。
为了验证多种模式,这是我做的:
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()]);
}
您是否尝试过使用setXsdSchemaCollection代替setXsdSchema?如果是,那么出了什么问题?如果不是,那为什么不呢? –
我试过了,但它不起作用。我无法找到使用setXsdSchema的实现示例。该方法要求您实现XsdSchema [] getXsdSchemas()和XmlValidator createValidator(),但我不知道如何实现createValidator()方法。简单地返回空使得应用程序不可用,并且XmlValidtor不能被实例化。 – facundop