【问题标题】:Replace XML MessageFormatter in Spring PayloadValidatingInterceptor在 Spring PayloadValidatingInterceptor 中替换 XML MessageFormatter
【发布时间】: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


    【解决方案1】:

    好吧,在做了更多研究之后,这个问题不是 Spring 的错。似乎是 Java 中 Sax 解析方式演变的产物。

    基本架构是 Spring -> JAXP -> Parser Provider (Xerces)。

    JAXP 界面允许设置功能,但不提供必要的功能 控件替换 Xerces 解析器中的 ErrorReporter 组件,也不 定制它。定制将涉及构建 Xerces 解析器实例 使用自定义 ErrorReporter 组件并覆盖 Xerces 实现 这是JVM的一部分。

    当我们试图交付产品时,这根本不是一个可行的选择 在我们可能无法控制的环境中的 JVM 之上。底线是我们有 以消息的方式生活。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多