2

Spring Integration を使用して、RESTful エンドポイントに渡された JSON ペイロードを処理しています。このフローの一部として、フィルターを使用して JSON を検証しています。

.filter(schemaValidationFilter, s -> s
    .discardFlow(f -> f
        .handle(message -> {
            throw new SchemaValidationException(message);
        }))
)

これはうまくいきます。ただし、検証が失敗した場合は、解析エラーをキャプチャしてユーザーに返し、ユーザーがエラーに対処できるようにする必要があります。以下は、SchemaValidationFilter クラスのオーバーライドされたacceptメソッドです。

@Override
public boolean accept(Message<?> message) {
  Assert.notNull(message);
  Assert.isTrue(message.getHeaders().containsKey(TYPE_NAME));

  String historyType = (String)message.getHeaders().get(TYPE_NAME);
  JSONObject payload = (JSONObject) message.getPayload();
  String jsonString = payload.toJSONString();

  try {
      ProcessingReport report = schemaValidator.validate(historyType, payload);
      return report.isSuccess();
  } catch (IOException | ProcessingException e) {
      throw new MessagingException(message, e);
  }

}

私たちが行ったことは、catch ブロックで、問題を解決しているように見える MessageException をスローすることです。ただし、これはフィルターが行うべきことを壊しているようです (単純に true または false を返す)。

フィルターからクライアントにエラーの詳細を渡すためのベスト プラクティスはありますか? フィルターはこのユース ケースに適したソリューションですか?

ご協力いただきありがとうございます!ジョン

4

2 に答える 2

0

<service-activator/>おそらく...で検証を行う方が正しいでしょう。

public Message<?> validate(Message<?> message) {

    ...

    try {
        ProcessingReport report = schemaValidator.validate(historyType, payload);
        return message;
    } 
    catch (IOException | ProcessingException e) {
        throw new MessagingException(message, e);
    }
}

...実際にフィルタリングすることはないからです。

于 2015-06-10T21:52:52.283 に答える