我有一个带有多个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的请求和响应?
答案 0 :(得分:3)
发布解决方案以供将来参考,因为我无法在互联网上找到一个例子。
要验证多个模式,我就是这样做的:
我最终使用了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()]);
}
答案 1 :(得分:0)
如果将所有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);
}