【发布时间】:2014-11-06 21:21:16
【问题描述】:
这几天我已经把头撞在墙上了。我们是 使用 Spring web services 2.1.3.RELEASE 并且我添加了一个简单的子类 PayloadValidatingInterceptor 用于捕获 XSD 架构验证错误。
配置:
<bean id="xsdValidationInterceptor" class="foo.bar.endpoint.interceptors.XSDValidatingInterceptor">
<property name="schemas">
<list>
<value>classpath:/xsd/requestName.xsd</value>
</list>
</property>
<property name="validateRequest" value="true"/>
<property name="validateResponse" value="true"/>
</bean>
XsdValidationInterceptor 覆盖 handleRequestValidationErrors:
@Override
protected boolean handleRequestValidationErrors(
MessageContext messageContext, SAXParseException[] errors)
throws TransformerException {
if ( getAddValidationErrorDetail() ) {
messageContext.setProperty(MessageContextConstants.KEY_SCHEMA_ERRORS, errors);
}
return true;
}
到目前为止一切顺利。这个问题是从 Xerces 解析器。问题是,我想要字段名称和行/列号 发生错误的地方,而不必从一个长字符串中挖掘出来 对于各种错误是不同的。似乎应该很简单,但 Spring 确实如此 似乎并不容易。并且一旦错误出现在 handleRequestValidationErrors 例程,异常消息已经被格式化。
具体来说,我想替换 XMLErrorReporter 或 XMLErrorReporter 在模式验证器中使用的 MessageFormatter Spring 创造的。 Xerces 提供了一个标准属性来替换 错误报告者;然而,Spring 并没有让这一切变得容易。它使用一个 硬编码的 JAXP 工厂调用 Jaxp13ValidatorFactory 来创建 一个 XMLValidator 对象,它本质上包装了一个 在每次请求处理时 Xerces 验证器。 XMLValidator 没有 允许在验证器实现上设置属性 创建。
我查看了 Xerces 的自定义配置以及其他 可能的黑客攻击,此时我唯一能想到的是 覆盖 XsdValidationInterceptor 中的 handleRequest 例程 创建我自己的验证器,我可以根据需要进行配置。
有人有更好的主意吗?
这与此处提出的问题相同,但遗憾的是没有回答:
How can I provide custom error messages using JAXP DocumentBuilder?
【问题讨论】:
标签: java xml xsd spring-ws xsd-validation