Java 处理findAll()上的空结果:是否有列表的OrelsThrow()?
我正在创建一个小小的春季休息服务。我有一个findById电话: 如果没有具有给定id的MyItem对象,我将使用Optional.orelsetrow方法引发异常。这是非常有用和非常简单的 现在,我添加了一个来自PagingAndSorting存储库的findAll调用:Java 处理findAll()上的空结果:是否有列表的OrelsThrow()?,java,spring-boot,spring-mvc,spring-data-jpa,crud,Java,Spring Boot,Spring Mvc,Spring Data Jpa,Crud,我正在创建一个小小的春季休息服务。我有一个findById电话: 如果没有具有给定id的MyItem对象,我将使用Optional.orelsetrow方法引发异常。这是非常有用和非常简单的 现在,我添加了一个来自PagingAndSorting存储库的findAll调用: @GetMapping("/items") List<MyItem> all() { return repository.findAll(); } 是否有一种简单的方法可以像处理
@GetMapping("/items")
List<MyItem> all() {
return repository.findAll();
}
是否有一种简单的方法可以像处理单个项目一样处理空列表输出?或者我需要创建类似于:
@GetMapping("/items")
List<MyItem> all() {
List<MyItem> items = repository.findAll();
if (items.isEmpty())
throw new MyItemNotFoundException();
return items;
}
真正的用例处理一些请求参数以过滤整个列表如果结果为非空,您可以对列表进行流式处理,使用findAny获取可选值并映射回列表:
items.stream().findAny().map((e) -> items).orElseThrow(NotFoundException::new);
但是你应该考虑这是否真的需要引起一个例外。作为搜索函数的使用者,我的期望是一个空结果,没有任何元素与我的条件匹配。如果结果非空,您可以流式处理列表,使用findAny获取可选结果并映射回列表:
items.stream().findAny().map((e) -> items).orElseThrow(NotFoundException::new);
但是你应该考虑这是否真的需要引起一个例外。作为搜索函数的使用者,我的期望是一个空结果,没有任何元素与我的条件匹配。findById中的可选元素背后的原因是它避免返回null
另一方面,空集合可以安全地进行迭代和处理,因此没有内置特殊的.throwIfEmpty机制。空集合本身本质上是可选的。它不是null,可能包含也可能不包含元素
如果在您的业务逻辑中,没有结果意味着错误,那么由您来处理它。findById中可选的原因是它避免返回null
另一方面,空集合可以安全地进行迭代和处理,因此没有内置特殊的.throwIfEmpty机制。空集合本身本质上是可选的。它不是null,可能包含也可能不包含元素
如果在您的业务逻辑中,没有结果就意味着错误,那么由您来处理它。对于REST,这是您应该返回的结果: 未找到单个元素:引发异常-404响应代码映射 空列表:返回状态代码为-200的空列表
休息时,这是您应该返回的内容: 未找到单个元素:引发异常-404响应代码映射 空列表:返回状态代码为-200的空列表
解决方案可以是一个封装findAll调用的实用函数 但是你会在一些基类/接口中找到一个位置
在某些系统中,存储库findAll可能返回null,这非常难看,并且使用这样一个包装函数也可以处理。解决方案可能是包装findAll调用的实用功能 但是你会在一些基类/接口中找到一个位置 在某些系统中,存储库findAll可能返回null,这非常难看,并且使用这样一个包装函数也可以处理。通常情况下,空项目列表并不是真正的错误。让客户端处理显示逻辑。通常,空项目列表并不是真正的错误。让客户端处理显示逻辑
public class MyItemNotFoundException ... {
public static <T> List<T> requireNotEmpty(List<T> items) throws MyItemNotFoundException {
if (items.isEmpty()) {
throw new MyItemNotFoundException();
}
return items;
}
}
@GetMapping("/items")
List<MyItem> all() {
return MyItemNotFoundException.requireNotEmpty(repository.findAll());
}
return MyItemNotFoundException.whenEmpty(repository.findAll());