处理 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
中。
问题:如何利用ResourceNotFoundException
的ResponseStatus
注解而不是添加重复代码?
删除 handleResourceNotFound
并让框架为您处理,或者 return 从 handleResourceNotFound
方法中适当 Response
。
通过声明此类处理程序,您表示您将处理此类情况,因此框架正在退出。
我有以下服务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
中。
问题:如何利用ResourceNotFoundException
的ResponseStatus
注解而不是添加重复代码?
删除 handleResourceNotFound
并让框架为您处理,或者 return 从 handleResourceNotFound
方法中适当 Response
。
通过声明此类处理程序,您表示您将处理此类情况,因此框架正在退出。