У меня есть 3 микросервиса с пружинной загрузкой, бизнес-сервис, конечная точка которого доступна для общего пользования, и 2 базовых сервиса, которые бизнес-сервис вызывает через HTTP-вызовы.
Текущее исключение обрабатывается таким образом. У меня есть глобальные RestHandler и ApiError в каждой службе.
public class ApiError {
private HttpStatus status;
private String timestamp;
private final boolean hasError = true;
private List<Error> errors;
private ApiError() {
timestamp = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
}
public ApiError(HttpStatus status) {
this();
this.status = status;
}
public ApiError(HttpStatus status, Throwable ex) {
this();
this.status = status;
}
public HttpStatus getStatus() {
return status;
}
public void setStatus(HttpStatus status) {
this.status = status;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public boolean isHasError() {
return hasError;
}
public List<Error> getErrors() {
return errors;
}
public void setErrors(List<Error> errors) {
this.errors = errors;
}
}
Скажем, я получаю исключение в одном из двух базовых сервисов, я обрабатываю его в глобальном обработчике исключений, сериализую и связываю его с ApiError и возвращаю ResponseEntity с помощью связанного ApiError.
В бизнес-сервисе я десериализирую тело, снова связываю его с ApiError и отправляю ответ обратно.
Это добавляет много дублирования кода. Я думал о том, чтобы просто выбросить исключения из базовых микросервисов, перехватить их в бизнес-сервисе и обработать в глобальном обработчике, чтобы получить пользовательский ответ.
Это эффективно? или это можно сделать лучше?