Java 处理findAll()上的空结果:是否有列表的OrelsThrow()?

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(); } 是否有一种简单的方法可以像处理

我正在创建一个小小的春季休息服务。我有一个findById电话:

如果没有具有给定id的MyItem对象,我将使用Optional.orelsetrow方法引发异常。这是非常有用和非常简单的

现在,我添加了一个来自PagingAndSorting存储库的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());