在mulesoft中未捕获异常

在mulesoft中未捕获异常,mule,mule-studio,Mule,Mule Studio,我正在处理一个应用程序,如果出现任何异常,它会适当地打印异常消息 package filter; import java.io.IOException; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.mule.api.MuleMessage;

我正在处理一个应用程序,如果出现任何异常,它会适当地打印异常消息

    package filter;
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.mule.api.MuleMessage;
public class ExceptionClass implements org.mule.api.routing.filter.Filter {

    @Override
    public boolean accept(MuleMessage message) {
        Map<String,Object> payload=(Map<String,Object>)message.getPayload();

        if(!payload.containsKey("productid"))
        {

            throw new java.lang.NullPointerException("no data found in payload "+payload.toString());

        }
        if(Integer.parseInt((String) payload.get("productid"))<5)
        {
        throw new IllegalArgumentException("invalid input to payload " +payload.toString());

        }
        return true;
    }

}
包过滤器;
导入java.io.IOException;
导入java.util.Map;
导入javax.servlet.ServletException;
导入javax.servlet.ServletRequest;
导入javax.servlet.ServletResponse;
导入org.mule.api.MuleMessage;
公共类ExceptionClass实现org.mule.api.routing.filter.filter{
@凌驾
公共布尔接受(多消息消息){
Map payload=(Map)message.getPayload();
如果(!payload.containsKey(“productid”))
{
抛出新的java.lang.NullPointerException(“在有效负载中找不到数据”+payload.toString());
}

如果(Integer.parseInt((String)payload.get(“productid”))异常策略未被调用的原因是您的异常策略位于块之外。请按以下方式更新它:

      <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时停止流,并且在设计上不会引发任何异常。因此,您实际上有两个更干净的选项来处理此场景。 (i) 使用验证组件,如果希望执行输入验证,mule打算使用该组件

因此,对于您的示例,这将是验证规则-

<validation:is-true config-ref="Validation_Configuration" expression="#[payload.containsKey('productid')]" message="payload doesnt have productid" doc:name="Validation"/>

更有趣的是,您可以使用All选项在同一个组件中放置多个验证:-like

<validation:all config-ref="Validation_Configuration"   doc:name="Validation">
            <validation:validations>
                <validation:is-true expression="#[Integer.parseInt((String) payload.get(&quot;productid&quot;))&lt;5]" message="prod id less than 5"/>
                <validation:is-true expression="#[payload.containsKey('productid')]" message="no product id"/>
            </validation:validations>
        </validation:all>

如果您进一步研究此组件,您将找到使用自定义异常或仅使用作为异常消息一部分记录的消息字符串捕获验证异常的方法

(ii)使用您已经使用过的过滤器,但将其包装在消息过滤器组件周围,如以下博客中所述: 在您的示例中,您可以使用以下表达式过滤器实现异常:

<message-filter doc:name="Message" throwOnUnaccepted="true">
        <expression-filter expression="#[payload.containsKey(&quot;productid&quot;)]" doc:name="Expression"/>
        </message-filter>

您的异常策略未被调用的原因是您的异常策略超出了您的区块。请按以下方式更新它:

      <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时停止流,并且在设计上不会引发任何异常。因此,您实际上有两个更干净的选项来处理此场景。 (i) 使用验证组件,如果希望执行输入验证,mule打算使用该组件

因此,对于您的示例,这将是验证规则-

<validation:is-true config-ref="Validation_Configuration" expression="#[payload.containsKey('productid')]" message="payload doesnt have productid" doc:name="Validation"/>

更有趣的是,您可以使用All选项在同一个组件中放置多个验证:-like

<validation:all config-ref="Validation_Configuration"   doc:name="Validation">
            <validation:validations>
                <validation:is-true expression="#[Integer.parseInt((String) payload.get(&quot;productid&quot;))&lt;5]" message="prod id less than 5"/>
                <validation:is-true expression="#[payload.containsKey('productid')]" message="no product id"/>
            </validation:validations>
        </validation:all>

如果您进一步研究此组件,您将找到使用自定义异常或仅使用作为异常消息一部分记录的消息字符串捕获验证异常的方法

(ii)使用您已经使用过的过滤器,但将其包装在消息过滤器组件周围,如以下博客中所述: 在您的示例中,您可以使用以下表达式过滤器实现异常:

<message-filter doc:name="Message" throwOnUnaccepted="true">
        <expression-filter expression="#[payload.containsKey(&quot;productid&quot;)]" doc:name="Expression"/>
        </message-filter>


非常感谢您的回答。事实上,我是昨天开始写的,所以不太了解:)非常感谢您的回答。事实上,我是昨天开始写的,所以不太了解:)