gpt4 book ai didi

java - 替换 Spring PayloadValidatingInterceptor 中的 XML MessageFormatter

转载 作者:太空宇宙 更新时间:2023-11-04 06:26:01 26 4
gpt4 key购买 nike

我已经在这件事上用头撞墙好几天了。我们是使用 Spring Web 服务 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 在模式 validator 中使用的 MessageFormatterSpring 创造的。 Xerces 提供了一个标准属性来替换错误报告者;然而,Spring 并没有让这一切变得容易。它使用一个硬编码的 JAXP 工厂称为 Jaxp13ValidatorFactory 来创建一个 XMLValidator 对象,它本质上包装了一个在每个请求处理时 Xerces validator 。 XMLValidator 没有允许在 validator 实现上设置属性创造。

我查看了 Xerces 以及其他的自定义配置可能的黑客攻击,此时我唯一能想到的是覆盖 XsdValidationInterceptor 中的handleRequest 例程创建我自己的 validator ,我可以根据需要进行配置。

大家有更好的想法吗?

这与此处提出的问题相同,但遗憾的是没有得到回答:

How can I provide custom error messages using JAXP DocumentBuilder?

最佳答案

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

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

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

当我们尝试交付产品时,这根本不是一个可行的替代方案在我们可能无法控制的环境中的 JVM 之上。底线是我们有接受这些消息的本来面目。

关于java - 替换 Spring PayloadValidatingInterceptor 中的 XML MessageFormatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26789615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com