Mule异常处理不返回响应

时间:2015-06-17 20:50:52

标签: java exception exception-handling mule

我有一个带有http:inbound-endpoint的mule流,它使用“请求 - 响应”的交换模式。

我在异常处理中注意到一些奇怪的事情。我在选择异常块中有两个catch异常块,一个将http状态设置为500,一个设置为401.将http状态设置为500会导致响应被发送回调用者,但是当我将http状态设置为401,流程继续编码,在捕获该异常的情况下不应该被命中。

以下是我的代码:

<choice-exception-strategy> <catch-exception-strategy doc:name="Catch UnauthorisedException Strategy"
            when="#[exception.causedBy(org.mule.api.security.UnauthorisedException)]">      
            <set-payload doc:name="Set Exception Message" value="Authentication credentials are required." />
            <set-property propertyName="http.status" value="401" doc:name="Set HTTP 401 Status" />
            <set-property propertyName="httpPath" value="#[message.inboundProperties.get('http.request.path')]" doc:name="Set httpPath"/>       
            <custom-transformer class="com.company.ErrorTransformer"
                doc:name="Transform Exception Message" />
            <json:object-to-json-transformer doc:name="Object to JSON" sourceClass="java.util.List" />
        </catch-exception-strategy> 
        <catch-exception-strategy doc:name="Catch Exception Strategy">
            <set-payload doc:name="Set Exception Message" value="A system error has occurred." />
            <set-property propertyName="http.status" value="500" doc:name="Set HTTP 500 Status" />
            <set-property propertyName="httpPath" value="#[message.inboundProperties.get('http.request.path')]" doc:name="Set httpPath"/>       
            <custom-transformer class="com.company.ErrorTransformer"
                doc:name="Transform Exception Message" />
            <json:object-to-json-transformer doc:name="Object to JSON" sourceClass="java.util.List" />
        </catch-exception-strategy>
  </choice-exception-strategy>

我试图使用以下帖子中的信息,但它没有任何效果: stack overflow post

当我的代码遇到401异常时,它永远不会像我预期的那样返回错误响应,尽管带有500代码的其他catch块会将错误响应返回给调用者。任何建议表示赞赏。

**编辑补充说这可能是一个测试问题。我在通过SOAPUI测试GET请求时看到了这种行为,但是,当我使用CURL尝试请求时,它确实表现得像我预期的那样:

curl -X GET http://localhost:8103/api/resource/8276 [{“errorCode”:“401”,“errorMessage”:“需要身份验证凭据。”}]

2 个答案:

答案 0 :(得分:0)

这里的问题实际上非常简单,生成输出时的HTTP传输检测到当前消息包含异常有效负载,当异常有效负载不同于null时,它总是会产生500错误给你一个工作的错觉。

通常使用http:response-builder可以克服这个问题。

看到这个 https://developer.mulesoft.com/docs/display/current/HTTP+Response+Builder

答案 1 :(得分:0)

事实证明我的代码很好,这实际上是一个导致我看到的行为的SOAPUI错误。 SOAPUI有时可以从过去的请求中缓存身份验证信息,并在新的请求中意外重用。

当我使用curl重新测试它时,代码表现得如下所示: curl -X GET http://localhost:8103/api/resource/8276 [{&#34; errorCode&#34;:&#34; 401&#34;,&#34; errorMessage&#34;:&#34;需要身份验证凭据。&#34 ;}]

此处的肥皂错误信息: http://sourceforge.net/p/soapui/bugs/4/