在Spring-Boot和Spring-Data 2.0之前,我使用org.springframework.boot.context.config.ResourceNotFoundException
来检查实体实例是否在数据库中。我在控制器中使用了以下异常处理程序:
@ExceptionHandler(ResourceNotFoundException.class)
public HttpStatus handleNotFoundResource() {
return HttpStatus.NOT_FOUND;
}
现在,由于存储库方法返回一个可选参数,因此我使用java.util.NoSuchElementException
在控制器中完成该工作:
@ExceptionHandler(NoSuchElementException.class)
public HttpStatus handleNotFoundResource() {
return HttpStatus.NOT_FOUND;
}
这是最佳做法吗?
答案 0 :(得分:0)
NoSuchElementException
的范围比您定义要在特定情况下抛出的自定义异常ResourceNotFoundException
的范围要大得多:数据库中没有实体/资源。
在控制器和存储库层之间,您可以进行除NoSuchElementException
之外的其他引发Repository.findXXX().get()
的方法调用(收集方法,其他Optional和还有许多其他方法)。
所以您的想法可能会产生不良的副作用。
为防止任何回归,您应显式处理Optional
之类的return Optional.orElseThrown(ResourceNotFoundException::new)
展开。
如果要概括它,可以为存储库引入一个基类来执行此处理。