Как использовать аннотацию @ResponseStatus при обработке исключения ResourceNotFoundException

#java #spring #spring-mvc #spring-data-rest

#java #весна #spring-mvc #spring-data-rest

Вопрос:

У меня есть следующий класс обслуживания:

 @Service
public class CitiesServiceImpl implements CitiesService {
  @Autowired
  private CitiesRepository citiesRepository;
  @Override
  public City getCityById(Integer cityId) {
    return citiesRepository.findById(cityId)
            .orElseThrow(ResourceNotFoundException::new);
  }
}
 

и он используется в моем контроллере:

 @RestController
@RequestMapping("/cities")
public class CitiesController {
  @Autowired
  private CitiesService citiesService;

  @GetMapping("/{cityId}")
  public City readCity(@PathVariable Integer cityId) {
    return citiesService.getCityById(cityId);
  }

  @ExceptionHandler(ResourceNotFoundException.class)
  String handleResourceNotFound(Exception e) {
    return e.getMessage();
  }
}
 

Поэтому, когда readCity вызывается с несуществующим cityID значением, ResourceNotFoundException оно будет выдано, а затем обработано обработчиком handleResourceNotFound исключений.

Однако, когда ResouceNotFoundException обрабатывается, код состояния в ответе по-прежнему равен 202, то есть OK. Кажется, что @ResponseStatus аннотация в ResourceNotFoundException не используется во время выполнения. Это можно исправить, добавив @ResponseStatus(значение=HttpStatus.NOT_FOUND) в метод handleResourceNotFound , но такой код дублируется, поскольку @ResponseStatus аннотация уже есть в ResourceNotFoundException .

Вопрос: Как использовать ResponseStatus аннотацию ResourceNotFoundException вместо добавления повторяющегося кода?

Комментарии:

1. Просто удалите этот бесполезный handleResourceNotFound метод или верните требуемый код самостоятельно.

Ответ №1:

Удалите это handleResourceNotFound , и пусть framework обработает это за вас, или верните правильный Response handleResourceNotFound метод from .

Объявляя такой обработчик, вы говорите, что будете обрабатывать такой случай, поэтому фреймворк отступает.

Комментарии:

1. Большое спасибо! кажется, что ResourceNotFoundException это обрабатывается самой Spring framework? и как?

2. Он просто улавливает это, анализирует упомянутые вами аннотации и генерирует правильный ответ.