У меня есть джетти-сервер, который выполняет некоторую логику, когда он закончил, он создает строку json (используя Джексона) и отправляет ее в ответ. Если во время создания json возникает исключение, генерируется исключение JsonProcessingException. Это исключение всплывает до UncaughtErrorHandler (расширяет ErrorHandler в Jetty), который регистрирует исключение и возвращает некоторое сообщение об ошибке и код состояния 500.
Это только для бэкэнд API.
Конечная точка не является идемпотентной (это конечная точка после записи), при изменении конечной точки и применении логики происходят изменения в состоянии приложения (т.е. базы данных).
Теперь, если возникает исключение JsonProcessingException, пользователь получит сообщение об ошибке и не будет знать, что процесс / логика завершен.
Как мне справиться с этим?
Вот мои мысли о возможных решениях:
- Оставьте существующее поведение, и если пользователь жалуется, техническая поддержка может прояснить, что процесс прошел. Или ошибка предупредит службу поддержки, и они проверит журналы и свяжутся с пользователем, чтобы сообщить, что они прошли.
- Оставьте конечную точку как идемпотентную (или аналогичную, т. Е. Без изменений в состоянии приложения), чтобы пользователь мог отправить тот же запрос (с тем же телом) и получить ответ (когда он работает, то есть без JsonProcessingException), который заявляет, что он уже сделал это, или не может сделать это, как он уже сделал.
- Поймать исключение JsonProcessingException при создании строки json, зарегистрировать его с сообщением об исключении и создать ответ без уведомления json о том, что процесс завершен. Хотя это означает, что пользователь должен будет обрабатывать два разных ответа, но уменьшает взаимодействие с человеком в вышеуказанном (текущем) решении.
- ИЛИ преобразовать / обернуть его в исключение времени выполнения (или другое исключение) и выбросить его в блок catch. Но назначьте лучшее сообщение об исключении (т.е. процесс был завершен). Затем в errorHandler я могу отобразить это сообщение об исключении в теле ответа, когда оно находит конкретное исключение. Таким образом, пользователь будет знать, что процесс завершен, и не будет отправлять другой запрос. Но, как указано выше, пользователю придется обрабатывать разные типы ответов.
- Не используйте Джексона для создания строки json, сделайте это вручную, используя String.format () и шаблон json. Это хорошо для простого json, но сложный json станет кошмаром.
- Иметь некоторую логику, которая проверяет, был ли предыдущий вызов выполнен, но не подтвержден в ответе, а затем совершает звонок пользователю (через некоторого клиента, например, по электронной почте / смс) с правильными деталями. Кажется, много работы.
У вас есть другие предложения?
Вот пример кода, показывающий, где это происходит:
private String createFailedResponseBodyJson(FailedPlaneLandStatus failedPlaneLandStatus) throws JsonProcessingException {
LinkedHashMap<String, String> jsonBody = new LinkedHashMap<>();
jsonBody.put("PlaneId", failedPlaneLandStatus.planeId.value);
jsonBody.put("PlaneStatus", failedPlaneLandStatus.planeStatus.name());
jsonBody.put("AirportStatus", failedPlaneLandStatus.airportStatus.name());
jsonBody.put("LandFailureReason", failedPlaneLandStatus.failureMessage.toString());
return new ObjectMapper().setDefaultPrettyPrinter(new DefaultPrettyPrinter())
.writerWithDefaultPrettyPrinter().writeValueAsString(jsonBody);
}
Это метод writeValueAsString (), который генерирует исключение JsonProcessingException
Я думаю, что я доволен существующим поведением (Первая точка). Но я просто хочу знать, являются ли другие решения (другие пункты) жизнеспособными, или есть другое решение?
Спасибо