当前位置: 首页 > 知识库问答 >
问题:

替换Spring PayloadValidatingInterceptor中的XML MessageFormatter

尹雅健
2023-03-14

在这件事上,我的头撞在墙上已经好几天了。我们正在使用SpringWebServices 2.1.3。我添加了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重写HandlerRequestValidationErrors:

@Override
protected boolean handleRequestValidationErrors(
        MessageContext messageContext, SAXParseException[] errors)
        throws TransformerException  {
    if ( getAddValidationErrorDetail() ) {
        messageContext.setProperty(MessageContextConstants.KEY_SCHEMA_ERRORS, errors);
    }
    return true;
}

到现在为止,一直都还不错。这个问题是Xerces解析器返回的消息的格式。问题是,我需要错误发生位置的字段名和行号/列号,而不必从不同错误的长字符串中挖掘出来。看起来应该很简单,但Spring似乎并没有让这变得容易。一旦错误出现在HandlerRequestValidationErrors例程中,异常消息已经格式化。

具体来说,我想替换XMLErrorReporter或XMLErrorReporter在Spring创建的模式验证器中使用的MessageFormatter。Xerces提供了用于替换错误报告器的标准属性;然而,Spring并没有让这变得容易。它使用一个名为Jaxp13ValidatorFactory的硬编码JAXP工厂来创建一个XMLValidator对象,该对象基本上在每次请求处理时包装Xerces验证器的创建。XMLValidator不允许在其创建的验证器实现上设置属性。

我已经研究了Xerces的自定义配置以及其他可能的黑客行为,目前我唯一能想到的是重写XsdValidationInterceptor中的handleRequest例程,创建我自己的验证器,我可以根据需要进行配置。

有谁有更好的主意吗?

这是这里提出的同样问题,但不幸的是没有得到回答:

如何使用JAXP DocumentBuilder提供自定义错误消息?

共有1个答案

宰父俊民
2023-03-14

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

基本架构是Spring-

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

当我们试图在我们可能无法控制的环境中交付基于JVM的产品时,这根本不是一个可行的选择。底线是,我们必须按照信息的方式生活。

 类似资料:
  • 我想替换我所有Wordpress帖子正文/内容(超过100万)中的所有URL href属性到我的新域“联系我们”URL,如: 喜欢 我可以用php做这个吗?或者有什么插件吗? 我无法将旧域名重定向到新域名,因为它已经过期,我无法访问它。我必须改变URL的href属性在每个Wordpress帖子。

  • 问题内容: 我是bash脚本的新手,但我不理解为什么它不起作用 第3行的替代替换错误 问题答案: 该替换在Bash 4.2.8中正常工作(并且根据文档看起来还不错)。 我最好的猜测是您实际上并没有使用Bash-您如何调用脚本?如果您正在执行此操作,则可能会与Dash或类似的程序一起运行(Dash确实在第3行给出了替换错误)。尝试使用Bash()显式运行它。 如果事实证明您实际上是在使用Dash,这

  • 我正在测试以下页面中的示例代码:https://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/ 但是在文件createsignaturebase.java中,在函数和中,它调用了一个不再存在的属性:。我仔细阅读了Pdfbox页面和它的迁移指南,它没有提到这

  • 我正在使用一个具有许多不同库依赖关系的gradle项目,并使用新的清单合并。在我的

  • Git 对象是不可改变的,但它提供一种有趣的方式来用其他对象假装替换数据库中的 Git 对象。 replace 命令可以让你在 Git 中指定一个对象并可以声称“每次你遇到这个 Git 对象时,假装它是其他的东西”。 在你用一个不同的提交替换历史中的一个提交时,这会非常有用。 例如,你有一个大型的代码历史并想把自己的仓库分成一个短的历史和一个更大更长久的历史,短历史供新的开发者使用,后者给喜欢数据

  • 我有两个文本文件,并用第二个文件中的实际匹配项替换XXX占位符-按照第二个文件中给出的顺序。 第一个文本是一个文件,在一行中有多行和多个占位符。 欧盟由以下国家组成:XXX、XXX、XXX、XXX、XXX。。。。欧盟内最大的三个国家是XXX,XXX,XXX。 第二个文件是每行一个匹配的列表: 波兰荷兰丹麦西班牙意大利德国法国 我想把它替换如下: 欧洲联盟由下列国家组成:波兰、荷兰、丹麦、西班牙、意

  • 问题内容: 有没有办法替换放置在HTML正文中的table元素内的普通文本? 喜欢用“ hi”代替“ hello”吗? 请仅使用不带 jQuery的* JavaScript 。 * 问题答案: 要用另一个字符串替换HTML中的字符串,请使用innerHTML的replace 请注意,这将替换整个正文的第一个实例,包括HTML代码中的任何实例(例如,类名等。),因此请谨慎使用- 为了获得更好的结果,

  • 问题内容: 我的apicontroller返回了以下JSON对象: 我要替换为 我已经尝试了下面的代码,但它仅代替的第一次出现。如何替换所有条目? 谢谢, 问题答案: 您需要使替换全局: 这样,它将继续替换null直到到达结尾 正则表达式文档: https://developer.mozilla.org/zh- CN/docs/Web/JavaScript/Reference/Global_Obj