我有一个带有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”:“需要身份验证凭据。”}]
答案 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/