从异常策略返回json编码的有效负载

时间:2013-11-06 19:20:40

标签: mule

我正在尝试使用Mule 3.4.0CE提供RESTful API并评估Jersey和Rest-router模块来处理这个问题。这大部分进展顺利,但我没有在Mule中实现RESTful API的具体/完整示例方面找到很多。

目前,对于使用rest-router工作的实体,我有简单的GET和PUT端点。 PUT流程成功地将内容传递给JDBC,但我对如何处理实体已存在的情况感到不知所措。

我可以依靠SqlException来捕获pk约束违规并且有一个异常策略处理:

<catch-exception-strategy when="#[exception.causedBy(java.sql.SQLException) and exception.getCauseException().getMessage().contains('Duplicate entry')]" doc:name="Duplicate_entry1">
          <set-payload value="The request cannot be processed, the error is #[exception.getSummaryMessage()]" doc:name="Set Payload"/> <!-- [1] -->
          <set-property propertyName="http.status" value="400" doc:name="Property"/> <!-- [2] -->
</catch-exception-strategy>

但我对两件事感到困惑:

1)捕获更具体的异常? 我能够获得与java.sql.SQLException匹配的异常策略,但宁愿匹配com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException的根本原因。使用该类和各种形式的casusedBy(),causeExactlyBy()和casueMatches()似乎找不到外部SQLException以外的任何东西。

2)如何返回一个简单的json编码有效负载以响应此错误? 我想在catch-exception-strategy中做的是创建一个KV对的映射,例如status =&#34; error&#34;和error_message =&#34;实体XX已经存在&#34;并将json编码为mule payload / response。

我很尴尬,我似乎无法通过MEL或MuleStudio中的各种组件来解决这个问题。寻找关于如何做到这一点的指针或文档。我正在拒绝构建一个自定义组件来返回我想要的地图,并在从Mule出来的路上编码json。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

For 1)在你的when子句中,你可以使用 org.mule.util.ExceptionUtils containsType()方法(构建在Apache ExceptionUtils类之上) 。它检查整个堆栈跟踪是否存在特定异常。
如果您不想在MEL中提供完全限定的类名(对于ExceptionUtils),则可以使用全局导入功能,如MEL Cheat Sheet的最后一部分所述。

我在Mule上发了两篇关于RESTful服务的博客文章(here&amp; here)。也许,你觉得它们很有用。