У меня есть RestControllerAdvice, который используется для возврата ответа с сообщением об исключениях, которые могут возникнуть во время бизнес-логики:
Код: Выделить всё
@Slf4j
@RestControllerAdvice
@RequiredArgsConstructor
public class ExceptionRestController {
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler({ FunctionalRuntimeException.class })
public DavinciApiResponse handleFunctionalRuntimeException(FunctionalRuntimeException exception) {
DavinciApiResponse response = ExceptionUtils.buildResponse(exception);
ExceptionUtils.logException(exception);
return response;
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({ ValidationException.class,
ConstraintViolationException.class })
public DavinciApiResponse handleValidationException(E exception) {
DavinciApiResponse response = ExceptionUtils.buildResponse(exception);
ExceptionUtils.logException(exception);
return response;
}
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public DavinciApiResponse handleAllUncaughtException(Exception exception) {
DavinciApiResponse response = ExceptionUtils.buildResponse(exception);
ExceptionUtils.logException(exception);
return response;
}
}
Из моего небольшого опыта работы я бы сказал да (это подход, который я использую всегда видел), но я с этим не совсем согласен...
Пример 1:
Мне нужно разработать многоязычное веб-приложение (АНГЛИЙСКИЙ - ФРАНЦУЗСКИЙ - ИСПАНСКИЙ )
Должен ли бэкэнд поддерживать язык?
Я почти уверен, что ответ — НЕТ. Ответственность за отображение страницы на языке, указанном пользователем, лежит на интерфейсе пользователя, поэтому его задача — показывать пользователю соответствующее сообщение об ошибке.
Пример 2:
Бэкэнд использует библиотеки с открытым исходным кодом, которые выбрасывают RuntimeExceptions.
В этом случае также невозможно напрямую манипулировать сообщением об исключении, в лучшем случае мне приходится обернуть его, передав в качестве аргумента новому исключению.
Возможное решение, которое я придумал для обработки сообщений об исключениях на нескольких языках, — это создать новый микросервис для обработки исключений бизнес-логики:
- API внешнего вызова микросервиса A
- в API было выдано исключение бизнес-логики, поэтому в качестве ответа он возвращает объект, содержащий messageCode (УНИКАЛЬНЫЙ КОД для идентификации сообщения) и messageParams (параметры) кода сообщения)
- интерфейс затем вызывает API «исключений бизнес-логики микросервиса», передавая в качестве запроса объект, содержащий messageCode, messageParams и язык
- Исключения бизнес-логики микросервиса возвращают сообщение об исключении, переведенное на требуемый язык, например, путем извлечения сообщения из базы данных с передачей кода сообщения.
Каковы альтернативы?
Подробнее здесь: https://stackoverflow.com/questions/786 ... roservices
Мобильная версия