Springboot rest apis и Response оценивают общие практики - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь создать свой первый Api rest на основе весенней загрузки и пытаюсь понять, какие обычные практики используются для возврата 404 в случае, если ресурс не найден.

Прежде всего, я надеваюНе знаю, стоит ли мне рассматривать поиск ресурса как «исключительного события» или просто что-то, что обычно происходит, и мое приложение должно часто обрабатывать.

Большинство найденных мной решений предполагают использование аннотированного исключения, которое сообщаетобработчики для возврата 404 в случае, если ресурс не найден.

Например:

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Resource not found")
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException() {
        super();
    }

    public ResourceNotFoundException(String message, Throwable cause) {
        super(message, cause);
    }

    public ResourceNotFoundException(String message) {
        super(message);
    }

    public ResourceNotFoundException(Throwable cause) {
        super(cause);
    }
}

Теперь мне интересно, учитывая тот факт, что я использую простейшую структуру для своего кода:

  1. Контроллер
  2. Сервис
  3. Хранилище

куда я должен его бросить?на уровне хранилища?или просто вернуть ноль и выдать исключение на уровне контроллера?это будет более эффективным или это просто плохая практика?

Ответы [ 5 ]

0 голосов
/ 25 ноября 2018
ResponseEntityExceptionHandler is the default implementation of Spring for handling of various error .In order to customize the error, override the method.     

 @ControllerAdvice
            @Slf4j
            public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

         @ExceptionHandler(value = { ResourceNotFoundException.class })
            @ResponseStatus(value = HttpStatus.NOT_FOUND)
            public ErrorResponse handleResourceNotFoundException(ResourceNotFoundException ex, WebRequest request) {
                logger.error("Handling resource not found exception ", ex);
                return new ErrorResponse(ex.getCode(), ex.getMessage());
            } 
            }
0 голосов
/ 24 ноября 2018

Рекомендуется генерировать исключение из службы в контроллер и обрабатывать исключение с соответствующим HttpStatus в @RestControllerAdvice классе.

Например,

Исключение, выбрасываемое из класса обслуживания в контроллер

@Service
public class ResourceServiceImpl implements ResourceService {

    @Override
    public void findById(String id) throws ResourceNotFoundException{
        throw new ResourceNotFoundException("your_error_code", "msg");
    }

}

Пример класса ControllerAdvice для обработки исключения и отправки ответа для вашего оставшегося API с вашим HTTP-состоянием и определенным объектом класса ErrorResponse как JSON.

@RestControllerAdvice
public class ErrorHandler {

    @ExceptionHandler(value = { ResourceNotFoundException.class })
    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    public ErrorResponse handleResourceNotFoundException(ResourceNotFoundException ex, WebRequest request) {
        logger.error("Handling resource not found exception ", ex);
        return new ErrorResponse(ex.getCode(), ex.getMessage());
    } 

}
0 голосов
/ 24 ноября 2018

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

@Service
public class EntityService {

    @Autowired
    private EntityRepository repository;

    public Entity findById (Long id) {
       return repository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException(String.format("Entity not found with id %d", id)));
    }
}
0 голосов
/ 24 ноября 2018

Способ, которым вы возвращаете ошибки, тесно связан с вашим API, тогда как код вашего сервиса должен быть независимым от API.Другими словами, если по какой-то причине вам нужно было добавить API-интерфейс SOAP рядом с API-интерфейсом REST, служебный код должен быть в состоянии обслуживать оба API-интерфейса.Следовательно, все, что тесно связано с API, должно обрабатываться на уровне, который реализует API, в данном случае на уровне вашего контроллера.

На моем текущем месте работы мы проверяем наличие ресурса, на который действуетв контроллере.Поскольку мы используем Hibernate, после извлечения объекта из базы данных он остается в кеше сеанса на время сеанса и не требует дополнительных затрат для извлечения второго раза на уровне обслуживания, если вы решите не передавать объект внизк сервису.

В SpringBoot исключение org.springframework.data.rest.webmvc.ResourceNotFoundException привязано к 404 NOT_FOUND.Поэтому вам не нужно было бы реализовывать какой-либо обработчик исключений для API, чтобы возвращать ответ с кодом состояния http 404.

0 голосов
/ 24 ноября 2018

Вы должны выбросить свое исключение в контроллер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...