【问题标题】:Mule - how to get Mule to throw an exception if XML schema validation failsMule - 如果 XML 模式验证失败,如何让 Mule 抛出异常
【发布时间】:2014-04-15 10:26:53
【问题描述】:

我正在使用 Mule 模式验证过滤器来根据给定方案验证传入的 XML 文件。以下是我对架构组件的配置:

<mulexml:schema-validation-filter schemaLocations="${app.home}/classes/schemas/Library.xsd" doc:name="Schema Validation"/>

我遇到的问题是,当文件无法针对架构进行验证时,Mule 会默默地阻止消息继续 - 即不会引发错误/异常。通过一些实验,我发现如果我将以下内容添加到我的 log4j.properties 文件中,我可以在架构验证中看到“错误”:

log4j.logger.org.mule.module.xml.filters.SchemaValidationFilter=DEBUG

由于这些错误是“DEBUG”级别的日志并且没有引发实际异常,因此我的流程不会恢复到我配置的异常策略。

所以我的问题是......

如果架构验证出现错误,我可以在这里做些什么来让 Mule 恢复到异常策略?我在下面包含了文件无法验证时看到的调试日志的副本。提前致谢。

DEBUG 2014-04-15 11:19:20,705 [[processes].orderInputFileConnector.receiver.01] org.mule.module.xml.filters.SchemaValidationFilter: SchemaValidationFilter rejected a message because it apparently failed to validate against the schema.
org.xml.sax.SAXParseException: cvc-pattern-valid: Value 'string' is not facet-valid with respect to pattern '[A-Z]{2}' for type 'countryISOA2'.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.elementLocallyValidType(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.processElementContent(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.handleEndElement(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.endElement(Unknown Source)
    at org.apache.xerces.jaxp.validation.DOMValidatorHelper.finishNode(Unknown Source)
    at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
    at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
    at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
    at org.mule.module.xml.filters.SchemaValidationFilter.accept(SchemaValidationFilter.java:107)
    at org.mule.routing.MessageFilter.accept(MessageFilter.java:89)
    at org.mule.processor.AbstractFilteringMessageProcessor.process(AbstractFilteringMessageProcessor.java:42)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:95)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
    at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:106)
    at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
    at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:106)
    at org.mule.processor.AbstractFilteringMessageProcessor.process(AbstractFilteringMessageProcessor.java:44)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
    at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:106)
    at org.mule.construct.AbstractPipeline$1.process(AbstractPipeline.java:112)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:95)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:54)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.access$001(InterceptingChainLifecycleWrapper.java:26)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper$1.process(InterceptingChainLifecycleWrapper.java:70)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:65)
    at org.mule.construct.AbstractPipeline$3.process(AbstractPipeline.java:204)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
    at org.mule.processor.chain.SimpleMessageProcessorChain.doProcess(SimpleMessageProcessorChain.java:47)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
    at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:106)
    at org.mule.processor.AbstractFilteringMessageProcessor.process(AbstractFilteringMessageProcessor.java:44)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
    at org.mule.processor.chain.SimpleMessageProcessorChain.doProcess(SimpleMessageProcessorChain.java:47)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.doProcess(InterceptingChainLifecycleWrapper.java:54)
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:70)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.access$001(InterceptingChainLifecycleWrapper.java:26)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper$1.process(InterceptingChainLifecycleWrapper.java:70)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:61)
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:47)
    at org.mule.processor.chain.InterceptingChainLifecycleWrapper.process(InterceptingChainLifecycleWrapper.java:65)
    at org.mule.transport.AbstractMessageReceiver.routeEvent(AbstractMessageReceiver.java:473)
    at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:226)
    at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:208)
    at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:200)
    at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:187)
    at org.mule.transport.file.FileMessageReceiver.moveAndDelete(FileMessageReceiver.java:560)
    at org.mule.transport.file.FileMessageReceiver.access$400(FileMessageReceiver.java:62)
    at org.mule.transport.file.FileMessageReceiver$2.process(FileMessageReceiver.java:410)
    at org.mule.transport.file.FileMessageReceiver$2.process(FileMessageReceiver.java:406)
    at org.mule.execution.ExecuteCallbackInterceptor.execute(ExecuteCallbackInterceptor.java:20)
    at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:34)
    at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:18)
    at org.mule.execution.BeginAndResolveTransactionInterceptor.execute(BeginAndResolveTransactionInterceptor.java:58)
    at org.mule.execution.ResolvePreviousTransactionInterceptor.execute(ResolvePreviousTransactionInterceptor.java:48)
    at org.mule.execution.SuspendXaTransactionInterceptor.execute(SuspendXaTransactionInterceptor.java:54)
    at org.mule.execution.ValidateTransactionalStateInterceptor.execute(ValidateTransactionalStateInterceptor.java:44)
    at org.mule.execution.IsolateCurrentTransactionInterceptor.execute(IsolateCurrentTransactionInterceptor.java:44)
    at org.mule.execution.ExternalTransactionInterceptor.execute(ExternalTransactionInterceptor.java:52)
    at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:32)
    at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:17)
    at org.mule.execution.TransactionalErrorHandlingExecutionTemplate.execute(TransactionalErrorHandlingExecutionTemplate.java:113)
    at org.mule.execution.TransactionalErrorHandlingExecutionTemplate.execute(TransactionalErrorHandlingExecutionTemplate.java:34)
    at org.mule.transport.file.FileMessageReceiver.processWithoutStreaming(FileMessageReceiver.java:405)
    at org.mule.transport.file.FileMessageReceiver.processFile(FileMessageReceiver.java:397)
    at org.mule.transport.file.FileMessageReceiver.poll(FileMessageReceiver.java:238)
    at org.mule.transport.AbstractPollingMessageReceiver.performPoll(AbstractPollingMessageReceiver.java:219)
    at org.mule.transport.PollingReceiverWorker.poll(PollingReceiverWorker.java:84)
    at org.mule.transport.PollingReceiverWorker.run(PollingReceiverWorker.java:53)
    at org.mule.work.WorkerContext.run(WorkerContext.java:311)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

更新

按照@RyanCarter 提供的答案(有效),我还找到了以下解决方案,该解决方案在 Mule Studio 内部没有出现任何错误。它涉及全局定义模式验证过滤器并在消息过滤器中引用它,如下所示:

<mulexml:schema-validation-filter name="myValidator".../>

<flow>          
    <message-filter throwOnUnaccepted="true">
       <filter ref="myValidator"/>
    </message-filter>

【问题讨论】:

    标签: xml validation exception xsd mule


    【解决方案1】:

    您可以将 schema-validation-filter 包装在 message-filter 中,并将 throwOnUnaccepted 设置为“true”:

    <message-filter throwOnUnaccepted="true">
       <mulexml:schema-validation-filter... />
    </message-filter>
    

    然后您可以使用异常策略来处理异常。

    【讨论】:

    • 谢谢@Ryan。我刚刚尝试了此选项,但在 &lt;message-filter&gt; 元素上出现错误提示“缺少嵌套过滤器”?
    • 这只是工作室的抱怨:)。如果你运行它,它应该可以工作。它对我有用。告诉我
    • 是的,这行得通。我还找到了一种不会导致烦人的工作室错误的替代方法。我已将此添加到原始帖子中。
    【解决方案2】:

    过滤器的目的是在条件不满足时停止处理。他们通常不会抛出异常并破坏流程。如果您必须获取异常并处理它,请尝试在过滤器中使用errorHandler-ref 属性并将其指向可以处理错误的spring bean。

    <mulexml:schema-validation-filter  errorHandler-ref="" ></mulexml:schema-validation-filter>
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复。我从来没有真正以这种方式处理过错误——你有类似的例子可以使用或适应吗?
    【解决方案3】:

    如果您想在模式验证中使用 errorHandler-ref="",只需创建一个实现 ErrorHandler 的 java 组件。在 java 组件中,您可以处理任何类型的验证错误并进行相应的处理。这是代码sn-p

    <mulexml:schema-validation-filter
        schemaLocations="abc.xsd"
        errorHandler-ref="Bean" returnResult="true" doc:name="Schema Validation"
        name="xmlvalidation" schemaLanguage="http://www.w3.org/2001/XMLSchema" />
    

    在 Mule 中创建 BEAN 为 -

    <spring:beans>
      <spring:bean id="Bean" name="Bean" class="com.training.ErrorHandler"/>
    </spring:beans>
    

    创建一个java类并实现“org.xml.sax.ErrorHandler”,如下-

    package com.training;
    
    import org.xml.sax.SAXException;
    import org.xml.sax.SAXParseException;
    
    public class ErrorHandler implements org.xml.sax.ErrorHandler{
    
    public ErrorHandler() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public void warning(SAXParseException exception) throws SAXException {
        System.out.println("do something here");
    
    }
    
    @Override
    public void error(SAXParseException exception) throws SAXException {
        System.out.println("do something here");
    
    
    }
    
    @Override
    public void fatalError(SAXParseException exception) throws SAXException {
        System.out.println("do something here");
    
    }
    

    }

    【讨论】:

    • 目前尚不清楚这如何回答问题 - 请添加一些详细信息。
    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2015-08-15
    相关资源
    最近更新 更多