Мы используем Spring Integration для обработки полезной нагрузки JSON, переданной в конечную точку RESTful. В рамках этого потока мы используем фильтр для проверки JSON:
.filter(schemaValidationFilter, s -> s
.discardFlow(f -> f
.handle(message -> {
throw new SchemaValidationException(message);
}))
)
Это прекрасно работает. Однако, если проверка не пройдена, мы хотим зафиксировать ошибку синтаксического анализа и вернуть ее пользователю, чтобы он мог отреагировать на ошибку. Вот переопределенный метод accept в классе SchemaValidationFilter:
@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).
Есть ли наилучшая практика для передачи сведений об ошибке от фильтра к клиенту? Является ли фильтр правильным решением для этого варианта использования?
Спасибо за вашу помощь! Джон