Лучший способ, который я обнаружил для обработки ошибок / исключений в веб-среде, - это создать собственное исключение с отключенной трассировкой стека и обработать его с помощью @ControllerAdvice
.
import lombok.Getter;
import org.springframework.http.HttpStatus;
public class MyException extends RuntimeException {
@Getter private HttpStatus httpStatus;
public MyException(String message) {
this(message, HttpStatus.INTERNAL_SERVER_ERROR);
}
public MyException(String message, HttpStatus status) {
super(message, null, false, false);
this.httpStatus = status;
}
}
А затем обработайте это в @ControllerAdvice
так:
@ExceptionHandler(MyException.class)
public ResponseEntity handleMyException(MyException exception) {
return ResponseEntity.status(exception.getHttpStatus()).body(
ErrorDTO.builder()
.message(exception.getMessage())
.description(exception.getHttpStatus().getReasonPhrase())
.build());
}
, где ErrorDTO
- это просто DTO с двумя полями:
@Value
@Builder
public class ErrorDTO {
private final String message;
private final String description;
}