Как использовать аннотацию @ResponseStatus при обработке ResourceNotFoundException - PullRequest
0 голосов
/ 15 апреля 2019

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

@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 вызывается с несуществующим cityIDResourceNotFoundException будет выброшен, а затем обработан обработчиком исключений handleResourceNotFound.

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

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

1 Ответ

0 голосов
/ 15 апреля 2019

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

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

...