NoSuchElementException是ResourceNotFoundException的良好替代品吗?

时间:2018-08-23 14:36:21

标签: java spring-boot exception-handling spring-data

在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;
}

这是最佳做法吗?

1 个答案:

答案 0 :(得分:0)

NoSuchElementException的范围比您定义要在特定情况下抛出的自定义异常ResourceNotFoundException的范围要大得多:数据库中没有实体/资源。
在控制器和存储库层之间,您可以进行除NoSuchElementException之外的其他引发Repository.findXXX().get()的方法调用(收集方法,其他Optional和还有许多其他方法)。

所以您的想法可能会产生不良的副作用。
为防止任何回归,您应显式处理Optional之类的return Optional.orElseThrown(ResourceNotFoundException::new)展开。
如果要概括它,可以为存储库引入一个基类来执行此处理。