Mule 3.4.0CE を使用して RESTful API を提供し、Jersey モジュールと Rest-router モジュールの両方を評価してこれを処理する実験を行っています。それはほとんどうまくいっていますが、RESTful API を Mule に実装する具体的/完全な例に関してはあまり見つけられません。
現在、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>
しかし、2つのことについて混乱しています:
1) より具体的な例外をキャッチしますか? java.sql.SQLException で一致する例外戦略を取得できますが、むしろ com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException の根本原因で一致したいと考えています。そのクラスとさまざまな形式の casusedBy()、causeExactlyBy()、および casueMatches() を使用しても、外側の SQLException 以外は何も検出されないようです。
と
2) このエラーに応答して単純な json でエンコードされたペイロードを返す方法は? catch-exception-strategy 内でやりたいことは、status="error" および error_message="entity XX already exists" のような KV ペアのマップを作成し、その json をミュール ペイロード/応答としてエンコードすることです。
MEL や MuleStudio のさまざまなコンポーネントを使用して単純にそれを行う方法を理解できないようで、恥ずかしい思いをしています。これを行う方法についてのポインタまたはドキュメントを探しています。必要なマップを返すカスタム コンポーネントを作成し、Mule から出る途中でその json をエンコードすることに抵抗しています。