mule mapping-exception-strategy只落到第一个401分支

时间:2017-02-08 03:56:18

标签: mule mule-studio

问这个mulesoft专业知识。

以下异常映射策略应该在hhtp.status 401,403,429上进行分支,但是继续进入状态代码401和403的401分支(至少,并且由调试和写入控制台的日志确定) :

   <apikit:mapping-exception-strategy doc:name="waysact-adaptor-main-exception-strategy">
       <apikit:mapping statusCode="401">
           <apikit:exception value="org.mule.module.http.internal.request.ResponseValidatorException"/>
           <logger message="psc&gt;&gt;&gt; logging 401 = #[payload]" level="INFO" doc:name="log-http-401"/>
       </apikit:mapping>
       <apikit:mapping statusCode="403">
           <apikit:exception value="org.mule.module.http.internal.request.ResponseValidatorException"/>
           <logger message="psc&gt;&gt;&gt; logging 403 = #[payload]" level="INFO" doc:name="log-http-403"/>
       </apikit:mapping>
       <apikit:mapping statusCode="429">
           <apikit:exception value="org.mule.module.http.internal.request.ResponseValidatorException"/>
           <logger message="psc&gt;&gt;&gt; logging 429 =  #[payload]" level="INFO" doc:name="log-http-429"/>
       </apikit:mapping>
       <apikit:mapping statusCode="400">
           <apikit:exception value="org.mule.module.http.internal.request.ResponseValidatorException"/>
           <logger message="psc&gt;&gt;&gt; logging anything =  #[payload]" level="INFO" doc:name="logging-anything"/>
       </apikit:mapping>
   </apikit:mapping-exception-strategy>

是因为它仅在异常类型org.mule.module.http.internal.request.ResponseValidatorException上进行分支?我认为这是为了分支状态代码?

还有另一种策略,即选择 - 异常策略,它应该分支在不同的异常对象类型上。

2 个答案:

答案 0 :(得分:0)

APIkit根据定义的异常值匹配异常,而不是由定义的statusCode匹配。使用选择异常策略并在其中定义多个catch异常策略。确保每个catch异常策略都匹配一个唯一的异常,以便为正确的http.status代码和所需的异常有效负载提供方法。

例如,如果要抛出400,请确保catch异常策略与BadrequestException匹配。如果状态代码来自HTTP请求者,则匹配ResponseValidatorException并设置传入的http.status和异常有效负载

答案 1 :(得分:0)

基于http.status的异常分支可以使用选择异常策略定义,如下例所示,

<choice-exception-strategy doc:name="Choice Exception Strategy">
    <catch-exception-strategy  when="#[message.inboundProperties.'http.status'=='404']" doc:name="Catch Exception Strategy" >
    <logger message="Exceptions message is ... #[exception.message]" level="ERROR"  doc:name="exceptionLogger"/>
    <set-variable variableName="exceptionMessage" value="#[exception.message]" doc:name="Set exceptionMessage"/>
    <set-payload value="{  errors: {     errorCode: #[message.inboundProperties.'http.status'],     errorMessage: #[flowVars.exceptionMessage]  }  }" doc:name="Set Exception Payload"/>
</catch-exception-strategy>
<catch-exception-strategy  doc:name="Catch Exception Strategy" >
    <logger message="Exception message is ... #[exception.message]" level="ERROR" category="com.project.stacktrace" doc:name="exceptionLogger"/>
    <set-variable variableName="exceptionMessage" value="#[exception.message]" doc:name="Set exceptionMessage"/>
    <set-payload value="{  errors: {     errorCode: #[message.inboundProperties.'http.status'],     errorMessage: #[flowVars.exceptionMessage]  }  }" doc:name="Set Exception Payload"/>
</catch-exception-strategy>
    </choice-exception-strategy>