Обрабатывать JsonProcessingException при построении ответа, но бизнес-логика уже завершена - PullRequest
0 голосов
/ 22 июня 2019

У меня есть джетти-сервер, который выполняет некоторую логику, когда он закончил, он создает строку 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

Я думаю, что я доволен существующим поведением (Первая точка). Но я просто хочу знать, являются ли другие решения (другие пункты) жизнеспособными, или есть другое решение?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...