当前位置: 首页 > 知识库问答 >
问题:

网络流量开关应该是这样工作的吗?

井通
2023-03-14

我有以下代码:

mySvc
.getItem() -> returns Mono<Optional<Item>>
.map(Optional::get)
.switchIfEmpty(...)

如果未找到该项,则该服务将返回 Optional.null。它确实调用了switchIfEmpty(),它返回一个异常,但随后它仍然去调用.map()并崩溃(NPE)。

但是如果我这样做了:

mySvc
.getItem() -> returns Mono<Optional<Item>>
.filter(Optional::isPresent)
.map(Optional::get)
.switchIfEmpty(...)

然后它按预期工作,只调用switchIfEmpty()。我可以发誓,在没有过滤器的情况下,这在某个时候是可行的。

SwitchedIf空()应该让执行继续进行吗?

编辑:

Controller:
  Mono<Item> get(id)
    return mysvc.getitem(id)
       .switchifempty(return 404 exception)

Service:
  Mono<Item> get(id)
    return asyncCache.getMap()
        .map(theMap -> theMap.getItem(id))

在服务层中,如果未找到,则 theMap.getItem(id)(即哈希映射)将返回 null。

第二版:

模拟

    hm.put(1, 2);
    hm.put(2, 4);

    return Mono.just(hm)
            .map(hm1 -> hm1.get(3));

共有1个答案

左丘子平
2023-03-14

您似乎是在将Mono#SwitchIfClear ty混为一谈,如果Mono是Mono.empty(),它会触发Java的可选;这两个是完全分开的。您的map无条件地调用可选#get,如果为空,则会抛出。

由于存在语义重叠,因此可以使用方便的方法。尝试:

Mono.justOrEmpty(mySvc.getItem()) // If this call returns an Optional<Item>
  .switchIfEmpty(...)

如果服务已经返回了< code >单声道

mySvc.getItem()
  .flatMap(Mono::justOrEmpty)
  .switchIfEmpty()
 类似资料:
  • 当客户端发出请求时,“MonoJust”会打印在第4行,但“test”会在Http响应正文中返回。我知道发布者在订阅之前不会生成数据,那么为什么Http响应包含“test”而不是“MonoJust”?

  • 我目前正在使用自定义JWT身份验证进行SpringCloudGateway。身份验证后,我希望使用GlobalFilter将标头中的JWT令牌字符串传递到下游服务: JWT令牌字符串可以通过调用主体来获得。getName(); 我的问题是:我如何实现

  • 问题内容: 我一直在挣扎着我的第一个正则表达式。在编译,并不断得到错误。 我只是更改为,它的工作就像一个梦。 我的印象是,荷兰国际集团将 同时 在带来等等那是不是这样的?我找不到解决此特定问题的任何文档。 问题答案: 是的,这就是Java中包导入的工作方式(应该如此)。例如,doing 将导入所有 类 ,但 不 导入子包及其类。 人机工程学,将 不会 导入或 阅读以下博客,获得一些友好的新手建议。

  • 简介 Charles是Mac下常用的对网络流量进行分析的工具,类似于Windows下的Fiddler。在开发iOS程序的时候,往往需要调试客户端和服务器的API接口,这个时候就可以用Charles,Charles能够拦截SSL请求、模拟慢速网络、支持修改网络请求包并多次发送、能够篡改Request和Response等强大的功能。下面介绍安装和使用方法。 下载安装 可以从这里下载Charles,有3

  • 我已经尝试了一段时间让smoothScrollToPositionFromTop()工作,但它并不总是滚动到正确的位置。 我有一个ListView(有10个条目)的布局,边上有10个按钮,所以我可以滚动到列表中的每个条目。通常,当我向后或向前滚动一个位置时,效果很好,但是当我试图向后或向前滚动超过3个位置时,ListView并不完全在所选位置结束。当它失败时,它通常会减少0.5到1.5个项目,并且

  • 问题内容: 我可以在Java监视程序上创建网络流量吗?该程序必须控制从计算机程序(包括OS模块)到网络驱动程序再返回的所有网络流量。如果是,如何? 注意: 我不仅要监视流量,还要对其进行控制。我想在Windows NT上实现这样的系统。仅靠Java无法实现它。如何在JNI的帮助下执行它? 也许是另一个变体。我不熟悉Windows服务,但仍然如此。我将在C 上编写一个程序并将其注册为Windows服