为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

暮色呼如 2023-08-04 17:33:43
我正在创建一个小型 Spring REST 服务。我有一个findById()电话:@GetMapping("/items/{id}")MyItem one(@PathVariable String id) {    return repository.findById(id).orElseThrow(() -> new MyItemNotFoundException(id));}如果没有给定的 MyItem 对象id,我将使用该方法抛出异常Optional<T>.orElseThrow()。这非常有用而且非常简单。现在我添加了findAll()来自PagingAndSorting<T, ID>存储库的调用:@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;}(真实用例处理一些请求参数来过滤整个列表)
查看完整描述

4 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

Optionalin背后的原因findById是它避免返回null.

另一方面,空集合可以安全地迭代和处理,因此没有.throwIfEmpty()内置的特殊机制。空集合本质上本身就是一个Optional。它不为 null,并且可能包含也可能不包含元素。

如果在您的业务逻辑中没有结果意味着错误,那么就由您来处理它。


查看完整回答
反对 回复 2023-08-04
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您可以流式传输列表,获取OptionalwithfindAny并映射回列表(如果结果非空):

items.stream().findAny().map((e) -> items).orElseThrow(NotFoundException::new);

但您应该考虑这是否真的需要导致异常。作为搜索功能的消费者,我的期望将是一个空结果,没有任何元素符合我的标准。


查看完整回答
反对 回复 2023-08-04
?
忽然笑

TA贡献1806条经验 获得超5个赞

解决方案可能是封装调用的实用函数findAll。


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());

}

将函数放在 MyItemNotFoundException 中可读性不太好。更好的名字仍然感觉不自然:


    return MyItemNotFoundException.whenEmpty(repository.findAll());

但是您会找到一个位置,也许在某个基类/接口中。

(在某系统中,存储库 findAll 可能返回 null(非常难看),并且使用这样的包装函数也可以处理。)



查看完整回答
反对 回复 2023-08-04
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

通过 REST,您应该返回以下内容:

  • 找不到单个元素:抛出异常 - 映射 404 响应代码

  • 空列表:返回带有 - 200 状态码的空列表


查看完整回答
反对 回复 2023-08-04
  • 4 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信