У меня есть 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 и язык
- "Исключения бизнес-логики микросервиса" возвращают сообщение об исключении, переведенное на требуемый язык, например, путем извлечения сообщения из базы данных с передачей messageCode.
Каковы альтернативы?
Подробнее здесь: https://stackoverflow.com/questions/786 ... roservices