В приложении Spring Boot я создал глобальный класс обработчика исключений, используя @RestControllerAdvice
, как показано ниже:
@Slf4j(topic = "GLOBAL_EXCEPTION_HANDLER")
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {-
@Override
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.UNPROCESSABLE_ENTITY.value(), VALIDATION_ERROR);
for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
errorResponse.addValidationError(fieldError.getField(), fieldError.getDefaultMessage());
}
return ResponseEntity.unprocessableEntity().body(errorResponse);
}
@ExceptionHandler(EntityNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ResponseEntity<Object> handleEntityNotFoundException(EntityNotFoundException ex,
WebRequest request) {
log.error(ENTITY_NOT_FOUND, ex);
return buildErrorResponse(ex, HttpStatus.NOT_FOUND, request);
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResponseEntity<Object> handleAllUncaughtException(Exception ex, WebRequest request) {
log.error(UNKNOWN_ERROR, ex);
return buildErrorResponse(ex, UNKNOWN_ERROR, HttpStatus.INTERNAL_SERVER_ERROR, request);
}
private ResponseEntity<Object> buildErrorResponse(Exception ex,
HttpStatus httpStatus,
WebRequest request) {
return buildErrorResponse(ex, ex.getMessage(), httpStatus, request);
}
private ResponseEntity<Object> buildErrorResponse(Exception ex,
String message,
HttpStatus httpStatus,
WebRequest request) {
ErrorResponse errorResponse = new ErrorResponse(httpStatus.value(), message);
if (printStackTrace && isTraceOn(request)) {
errorResponse.setStackTrace(ExceptionUtils.getStackTrace(ex));
}
return ResponseEntity.status(httpStatus).body(errorResponse);
}
@Override
public ResponseEntity<Object> handleExceptionInternal(
Exception ex,
Object body,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
return buildErrorResponse(ex, status, request);
}
}
У меня есть метод обслуживания, как показано ниже:
private List<Employee> findByName(String name) {
List<Employee> employees = employeeRepo.findByName(name);
// At this stage, should I check if the result is empty list and then throw exception?
if (employees.isEmpty()) {
throw new EntityNotFoundException("Not found any employee");
}
return employees;
}
Прежде чем возвращать список сотрудников, должен ли я проверить, является ли результат пустым списком, а затем выдать исключение?
Зависит от ситуации и чего вы хотите этим добиться. Это способ показать запрашивающему клиенту, что сотрудников с запрошенным именем нет. Вы должны заменить «runways.isEmpty()» на «employees.isEmpty()», иначе вы можете получить ошибку в процессе сборки.
Поскольку вы уже используете пользовательский ExceptionHandler, вы легко выдаете Exception, а затем прерываете сообщение об исключении своим собственным настраиваемым сообщением об исключении.
Другой вариант без создания исключения заключается в том, что вы можете просто вернуть пустой список, и если у вас есть приложение FE, вы можете проверить, пуст ли список или нет, и в соответствии с этим вы должны показать соответствующее сообщение для клиент.
Спасибо за подробную информацию. На самом деле я буду использовать Postman, а не какое-либо приложение FE, и по этой причине я подумал, что было бы неплохо показать сообщение об ошибке (как предупреждение, конечно, указывающее, что результат пуст) в объекте ответа. Есть идеи?
@Closures Почему закрыть?