处理ResourceNotFoundException时如何利用@ResponseStatus批注

时间:2019-04-15 16:29:14

标签: java spring 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,即确定。似乎在运行时未使用@ResponseStatus中的ResourceNotFoundException注释。可以通过将@ResponseStatus(value = HttpStatus.NOT_FOUND)添加到方法handleResourceNotFound来解决此问题,但是由于@ResponseStatus注释中已经包含ResourceNotFoundException,所以这些代码是重复的。

问题:如何利用ResponseStatus的{​​{1}}注释而不是添加重复的代码?

1 个答案:

答案 0 :(得分:0)

删除该handleResourceNotFound并让框架为您处理,或者从Response方法返回正确的handleResourceNotFound

通过声明这样的处理程序,您是说您将处理这种情况,因此框架正在退出。