Должен ли я возвращать EntityNotFoundException для пустого результата в Spring Boot?

В приложении 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;
}

Прежде чем возвращать список сотрудников, должен ли я проверить, является ли результат пустым списком, а затем выдать исключение?

@Closures Почему закрыть?

Jack 25.11.2022 11:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
223
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Зависит от ситуации и чего вы хотите этим добиться. Это способ показать запрашивающему клиенту, что сотрудников с запрошенным именем нет. Вы должны заменить «runways.isEmpty()» на «employees.isEmpty()», иначе вы можете получить ошибку в процессе сборки.

Поскольку вы уже используете пользовательский ExceptionHandler, вы легко выдаете Exception, а затем прерываете сообщение об исключении своим собственным настраиваемым сообщением об исключении.

Другой вариант без создания исключения заключается в том, что вы можете просто вернуть пустой список, и если у вас есть приложение FE, вы можете проверить, пуст ли список или нет, и в соответствии с этим вы должны показать соответствующее сообщение для клиент.

Спасибо за подробную информацию. На самом деле я буду использовать Postman, а не какое-либо приложение FE, и по этой причине я подумал, что было бы неплохо показать сообщение об ошибке (как предупреждение, конечно, указывающее, что результат пуст) в объекте ответа. Есть идеи?

Jack 24.11.2022 15:28

Другие вопросы по теме