Java NoTouchElementException是ResourceNotFoundException的一个很好的替代方案吗?

Java NoTouchElementException是ResourceNotFoundException的一个很好的替代方案吗?,java,spring-boot,exception-handling,spring-data,Java,Spring Boot,Exception Handling,Spring Data,在SpringBoot和SpringData2.0之前,我使用org.springframework.Boot.context.config.ResourceNotFoundException检查数据库中是否存在实体实例。我在控制器中使用了以下异常处理程序: @ExceptionHandler(ResourceNotFoundException.class) 公共HttpStatus handleNotFoundResource(){ 返回HttpStatus.NOT_FOUND; } 现在,

在SpringBoot和SpringData2.0之前,我使用
org.springframework.Boot.context.config.ResourceNotFoundException
检查数据库中是否存在实体实例。我在控制器中使用了以下异常处理程序:

@ExceptionHandler(ResourceNotFoundException.class)
公共HttpStatus handleNotFoundResource(){
返回HttpStatus.NOT_FOUND;
}
现在,由于存储库方法返回一个可选值,我使用
java.util.NoSuchElementException
在控制器中执行此任务:

@ExceptionHandler(NoSuchElementException.class)
公共HttpStatus handleNotFoundResource(){
返回HttpStatus.NOT_FOUND;
}

这是最佳实践吗?

NoTouchElementException
比您定义在特定情况下抛出的自定义异常
ResourceNotFoundException
范围更广:数据库中没有实体/资源。
在控制器和存储库层之间,除了
repository.findXXX().get()
,您还可以进行其他方法调用,这些方法调用抛出
NoSuchElementException
(收集方法,其他可选方法,还有许多其他方法)

因此,您的想法可能会产生不良副作用。
为了防止任何回归,您应该显式地处理
可选的
展开,例如
返回可选的.orelsebrown(ResourceNotFoundException::new)


如果您想对其进行泛化,可以为您的存储库引入一个基类来执行此处理

可能使用
optional.orelsetrow(ResourceNotFoundException::new)
我没有意识到其他方法可以抛出
NoTouchElementException
,但这是不可取的吗?我认为我们喜欢异常的原因之一是抛出任何地方,捕获一次。原则上是正确的,但是404是对所有出现的NosTouchElementException的正确响应吗?也许400更好,如果它发生在处理请求体的时候。我不知道这句谚语。是的。但问题是你在这里抓住了什么?“一网打尽”将是“一网打尽”,正确利用它的唯一方法是记录“休斯顿我们有问题”之类的内容。但是,即使其他类没有引发此异常,您也可以在服务或控制器中使用其他
可选
对象,这些对象引发异常的原因不是“找不到资源”。@banan3'14但我知道“写一次,在任何地方运行”:@david我根据“写一次,在任何地方运行”:D编造了它