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 を返す)。
フィルターからクライアントにエラーの詳細を渡すためのベスト プラクティスはありますか? フィルターはこのユース ケースに適したソリューションですか?
ご協力いただきありがとうございます!ジョン