您的异常策略没有被调用的原因是您的异常策略在您的块之外。更新如下:
<flow name="muleexceptionhandlingFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP" >
<http:response-builder statusCode="#[flowVars['statuscode']]" reasonPhrase="#[flowVars['reason']]"/>
</http:listener>
<json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
<custom-filter doc:name="Custom" class="filter.ExceptionClass"/>
<logger message="payload:#[payload]" level="INFO" doc:name="Logger"/>
<logger message="#[message]" level="INFO" doc:name="Logger"/>
<set-payload value="payload:#[payload]" doc:name="Set Payload"/>
<choice-exception-strategy name="muleexceptionhandlingChoice_Exception_Strategy">
<catch-exception-strategy doc:name="Catch Missing Data Exception Strategy" logException="false" when="#[exception.causedBy(java.lang.NullPointerException)]">
<set-payload value="Missing data:#[payload]" doc:name="Set Payload"/>
<set-variable variableName="reason" value="missing input data" doc:name="Variable"/>
<set-variable variableName="statuscode" value="400" doc:name="Variable"/>
</catch-exception-strategy>
<catch-exception-strategy doc:name="Catch Invalid data Exception Strategy" logException="false" when="#[exception.causedBy(java.lang.IllegalArgumentException)}">
<set-payload value="Invalid Data:#[payload]" doc:name="Set Payload"/>
<set-variable variableName="reason" value="invalid input" doc:name="Variable"/>
<set-variable variableName="statuscode" value="400" doc:name="Variable"/>
</catch-exception-strategy>
</choice-exception-strategy>
</flow>
我刚刚在博客中阅读了你的用例,让我印象深刻的是,即使你的代码可以正常工作,并按预期给出结果,但过滤器的设计是,如果它返回false,则只会停止流,并且在设计上不会引发任何异常。因此,实际上有两个更简洁的选项来处理这个场景。
对于您的示例,这将是验证规则-
<validation:is-true config-ref="Validation_Configuration" expression="#[payload.containsKey('productid')]" message="payload doesnt have productid" doc:name="Validation"/>
更有趣的是,您可以使用All选项在同一个组件中进行多个验证
<validation:all config-ref="Validation_Configuration" doc:name="Validation">
<validation:validations>
<validation:is-true expression="#[Integer.parseInt((String) payload.get("productid"))<5]" message="prod id less than 5"/>
<validation:is-true expression="#[payload.containsKey('productid')]" message="no product id"/>
</validation:validations>
</validation:all>
(ii)使用您已经使用过的过滤器,但将其围绕在消息过滤器组件周围,如以下博客中所述:
https://www.ricston.com/blog/playing-with-mule-filters/
在您的示例中,可以使用以下表达式过滤器实现异常:
<message-filter doc:name="Message" throwOnUnaccepted="true">
<expression-filter expression="#[payload.containsKey("productid")]" doc:name="Expression"/>
</message-filter>