处理 ResourceNotFoundException 时如何使用 @ResponseStatus 注释

How to utilize the @ResponseStatus annotation when handling the ResourceNotFoundException

我有以下服务class:

@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();
  }
}

因此,当使用不存在的 cityID 调用 readCity 时,ResourceNotFoundException 将被抛出,然后由 handleResourceNotFound 异常处理程序处理。

然而,处​​理ResouceNotFoundException时,响应中的状态码仍然是202,即OK。似乎 ResourceNotFoundException 中的 @ResponseStatus 注释在 运行 时未被使用。这可以通过将 @ResponseStatus(value=HttpStatus.NOT_FOUND) 添加到方法 handleResourceNotFound 来解决,但是这样的代码是重复的,因为 @ResponseStatus 注释已经在 ResourceNotFoundException 中。

问题:如何利用ResourceNotFoundExceptionResponseStatus注解而不是添加重复代码?

删除 handleResourceNotFound 并让框架为您处理,或者 return 从 handleResourceNotFound 方法中适当 Response

通过声明此类处理程序,您表示您将处理此类情况,因此框架正在退出。