WebClient 的 bodyToMono 对空主体的预期行为

2024-03-14

当 WebClient bodyToMono 遇到空主体时,预期的行为是什么?在我的具体示例中,我们正在检查从调用后返回的状态,如果是错误,则将其转换为我们的自定义错误格式。如果转换为自定义错误格式失败,我们会以自定义格式创建一个新错误来说明这一点。但是,当收到的响应是一个空正文错误时,它根本无法发送任何错误,因为 bodyToMono 没有像我预期的那样失败。请参阅下面的代码块:

.retrieve()
.onStatus(HttpStatus::isError) { response ->
    response.bodyToMono(ErrorResponse::class.java)
        .doOnError {
            throw APIException(
                code = UNEXPECTED_RESPONSE_CODE,
                reason = it.message ?: "Could not parse error response from Inventory Availability",
                httpStatus = response.statusCode()
            )
        }
        .map {
            throw APIException(
                reason = it.errors.reason,
                code = it.errors.code,
                httpStatus = response.statusCode()
            )
        }
}

为了解决这个问题,我们添加了 switchIfEmpty。

.retrieve()
.onStatus(HttpStatus::isError) { response ->
    response.bodyToMono(ErrorResponse::class.java)
        .switchIfEmpty { throw RuntimeException("Received Empty Response Body") }
        .doOnError {
            throw APIException(
                code = UNEXPECTED_RESPONSE_CODE,
                reason = it.message ?: "Could not parse error response from Inventory Availability",
                httpStatus = response.statusCode()
            )
        }
        .map {
            throw APIException(
                reason = it.errors.reason,
                code = it.errors.code,
                httpStatus = response.statusCode()
            )
        }
}

我的问题是:这是 bodyToMono 的预期行为吗?由于我明确要求将响应主体映射到我的 ErrorResponse 对象,因此我期望一个空主体出错,然后点击 doOnError 块,但它只是“成功”/返回一个空的单声道...因此我们添加switchIfEmpty 块。如果我们映射到的对象具有可为空的字段,我可以看到它没有错误,但由于所有字段都是必需的,为什么 bodyToMono 在尝试将“无”映射到我的对象时不会抛出错误?


这是对的。 Mono 可以生成 0..1 个元素,而空主体只会生成一个在不发出值的情况下完成的 Mono,很像 Mono.empty()。

如果在您的用例中没有主体出现错误,您可以在单声道上调用 .single() 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebClient 的 bodyToMono 对空主体的预期行为 的相关文章

  • ApplicationEventMulticaster 未初始化 - 在多播事件之前调用“刷新”

    我正在尝试实施ehcache对于我的应用程序 但是当尝试调用服务器时 出现以下错误 java lang IllegalStateException ApplicationEventMulticaster not initialized ca
  • 断路器和隔板式有什么区别?

    在微服务开发过程中 我们可以在Spring Boot中同时使用两者吗 这些都是从根本上不同的图案 The 断路器模式在消费者上实现 以避免压垮可能难以处理呼叫的服务 可以找到 Spring 中的示例实现here http www vinsg
  • Flyway无序迁移

    想象一下我有以下飞行路线迁移 V1 create table sql V2 create table sql V4 create table sql 这些迁移已经应用到我的数据库中 是否可以添加以下脚本 V3 create table sq
  • 在 Spring Boot application.properties 中指定信任存储信息

    我在用springBoot版本1 2 0 RELEASE 我正在尝试通过配置我的密钥库和信任库application properties 当我添加以下设置时 我可以使密钥库正常工作 但不能使信任库正常工作 server ssl key s
  • Spring Data JPA Redis:无法编写基于自定义方法的查询

    我已经使用 Redis 配置了 Spring Data JPA 并使用RedisRepositorieswith 提供了类似的方法find findAll 所有这些方法似乎都工作得很好 但我无法编写我的自定义方法 RedisEntity f
  • 2015 年重新审视 Ember Handling 401

    我可以在 Ember Ember Data 中找到大量询问 回答如何从 Rails 后端处理 401 的老问题 许多 如果不是全部的话 在这一点上似乎已经过时了 我已经尝试了我能找到的一切 Ember 数据处理 401 https stac
  • 使用 Spring Security 将数据库和 SAML 身份验证合并到一个应用程序中

    我正在尝试使用 spring security spring security starter 在 spring boot 2 2 4 应用程序中实现身份验证和授权 使用案例 根据用户名 我想将用户重定向到特定的身份验证提供商 如果用户名结
  • Web 应用程序的 Spring Boot 和 Comodo https 配置

    我是 https 配置的新手 并尝试配置 spring boot 和 Comodo SSL 经过几次电话和尝试后 我已经弄清楚如何为您的 spring boot 网站正确配置 https 下面的答案是详细步骤 希望它可以帮助人们生成更安全的
  • Spring - 两种不同的 POST 方法,具有相同的 URL,但生成的内容类型不同

    我有以下控制器 RequiredArgsConstructor RestController public class OwnerViewController implements ApiOwnerViewController privat
  • spring-boot-autoconfigure-processor 的目的?

    目的是什么 annotationProcessor org springframework boot spring boot autoconfigure processor 无论有没有它 我的应用程序都可以正常工作 我创建的薄罐子在依赖项目
  • Kotlin JavaScript 到 TypeScript 定义文件

    我已经找到了ts2kt 库 https github com Kotlin ts2kt这将从任意位置创建 Kotlin 头文件 d ts文件 但是 我想朝相反的方向走 我想构建一个可以编译为 JavaScript 的 Kotlin 库 但我
  • 批处理文件测试错误级别

    我试图在另一个 exe 成功执行时有条件地从批处理文件有条件地运行一个 exe 我尝试了 IF 和 ERRORLEVEL 的几种不同组合 但似乎都不起作用 TeamBuildTypes Current Branch DatabaseUpda
  • Kotlin 中的单例类

    我想知道如何在 Kotlin 中创建一个单例类 以便我的 Util 类在每次应用程序执行时仅实例化一次 但是 当我将 Java 类转换为 kotlin 时 生成了以下代码 它是否正确 companion object private var
  • 调试断言失败。表达式(流!=NULL)

    我收到以下错误 调试断言失败 表达式 流 NULL 文件 f dd vctools crty bld self x86 crt src fwrite c 创建 4 个线程时 CPU 使用率 100 该代码最初运行良好一段时间 然后给出此错误
  • com.netflix.zuul.exception.ZuulException:Hystrix 读取超时

    我正在尝试使用 eureka 和 zuul 进行微服务 而且所有请求都有问题 耗时超过1秒 据我了解 1秒是默认的hystrix超时 为了在Zuul中配置超时 我必须配置这些属性 hystrix command default execut
  • Spring Boot 中 application.properties 可用的属性列表?

    Spring Boot文档说我们可以在application properties文件中设置属性 但我找不到列出可以设置的可用属性的文档 我在哪里可以找到这样的文档 例如 我想为嵌入式servlet设置documentRoot 我发现set
  • 在viewpager2中禁用动画

    我有 viewpager2 和扩展 FragmentStateAdapter 的适配器 我希望用户仅通过单击选项卡布局即可转到另一个页面 我已禁用此 viewpager2 的用户输入 但是当我单击选项卡时 有页面之间快速滑动的动画 但我只想
  • 如何将 Android Room 数据库中的 Not Null 表列迁移为 Null

    我是 Android 房间库的新手 我需要将 Not Null 列迁移到 Null 但房间迁移只允许在 ALTER 表查询中添加或重命名 如何执行列迁移查询 Entity tableName vehicle detail data clas
  • Spring Boot 模板未解决

    我正在尝试使用 Spring Boot 和 Thymeleaf 构建一个独立的 Web 应用程序 该应用程序在 IntelliJ IDEA 中运行良好 但我无法单独运行该 jar 显然模板不包括在内 我的项目结构如下 src main ja
  • 为什么 jar 执行的通配符在 docker CMD 中不起作用?

    我有一个Dockerfile与以下CMD启动我的 Spring Boot 应用程序 FROM java 8 jre CMD java jar app file jar 当我尝试从创建的图像启动容器时 我得到 Error Unable to

随机推荐

  • Rails Active Storage 本地附件因神秘错误而失败:未初始化常量可分析

    红宝石 2 7 1 rails 6 0 3 2 我无法使本地活动存储附件正常工作 这是我的设置 我跑了 rails active storage install rake db migrate 模型架构 create table amazo
  • 在字符串和冒泡排序上使用 charAt() 方法[重复]

    这个问题在这里已经有答案了 我试图对字符串进行冒泡排序 但出现以下错误 MyClass java 13 error unexpected type str1 charAt i 1 str1 charAt i required variabl
  • 在 Jetpack Compose 中显示自定义警报对话框

    我正在搜索如何在 Jetpack Compose 中创建自定义对话框 在 XML 或 Material Design 中 我们可以轻松创建自定义对话框 在其中我们可以接受用户输入 单选按钮等 但我在 Jetpack Compose 中没有找
  • mobile safari 如何确定何时提示用户共享位置?

    我有一个移动网络应用程序 我想跟踪用户的最新位置 但前提是他们位于某个区域 但是 iPhone 上出现过多的提示有点麻烦 有一些位置初始化代码 大致如下 if firstTime navigator getCurrentPosition f
  • Spark DataFrame 中将 null 值转换为空数组

    我有一个 Spark 数据框 其中一列是整数数组 该列可以为空 因为它来自左外连接 我想将所有空值转换为空数组 这样以后就不必处理空值了 我想我可以这样做 val myCol df myCol df withColumn myCol whe
  • CSS 三角形填充进度条

    我实际上用谷歌搜索并搜索了一些信息 但找不到 My aim is to achieve something similar to progress bar styling such as filling inside of triangle
  • 有什么好的库可以读取和写入 csv 文件吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 的 CSV API https stackoverflow com questions 101100 csv api for java 您能推荐一个用于读取 也可能写入 CSV 文件的 Ja
  • AJAX 请求返回 unicode 字符作为问号

    我有 AJAX 调用以下 PHP 脚本 然后我使用以下 JavaScript 调用该脚本 AJAX function url data callback var a new XM
  • 如何将矩阵划分为大小不等的子矩阵?

    我想知道是否可以使用mat2cell函数来划分MxN将矩阵分成 10 个具有相同列大小的子矩阵 N 并且行大小大致相同 M 10 If mod M 10 0那么所有子矩阵将具有相同的大小 否则一些矩阵将具有 1 行 这可以通过mat2cel
  • 调用 YouTube 应用程序打开 Youtube 频道 (Android)

    我想打开显示特定频道的 YouTube 应用程序 但这仅执行浏览器 try Intent intent new Intent Intent ACTION VIEW intent setData Uri parse http www yout
  • 如何在 Python 中使用多个字符串参数

    我想使用 s 将两个参数传递给我的字符串 我尝试了这个 但没有成功 title im s with s title programming python 它给出了这个错误 Traceback most recent call last Fi
  • 无法调用网络服务

    我目前正在尝试使用使用 Apache CXF 构建的客户端来调用 Web 服务 尽管该服务在浏览器中可用 但由于以下错误 我无法连接到它 关于这个问题有什么想法吗 org apache cxf phase PhaseInterceptorC
  • 使用 get_posts 显示 WordPress 帖子 - 第一篇帖子不显示日期

    您好 我正在使用 get posts 来获取所有标记为 新闻 的帖子并将其显示在给定页面上 我使用 the date 来获取日期 但奇怪的是第一篇文章没有显示日期 而此后的所有文章都显示日期 此外 我还使用了相同的代码在另一个页面上显示标记
  • 按钮边距的布局问题

    我在 Android 应用程序中组织布局时遇到问题 我正在动态创建按钮并使用此代码将它们添加到我的布局中 LayoutInflater layoutInflater LayoutInflater getBaseContext getSyst
  • 如何在 R 中 gsub 一个空的“”字符串?

    如何替换空字符串 This x c b gsub taco x 产生 taco tacobtaco 代替 taco b 有什么办法可以替换空字符串吗 我会用nchar here x nchar x 0 lt taco EDIT 如果您正在寻
  • 如何获取ServiceState的实例?

    我正在尝试获取一个实例ServiceState in my Activity 但我该怎么做呢 没有静态方法可以获取实例 也没有任何服务上的任何方法返回ServiceState实例 有的是TelephonyManager listen 称呼
  • 如何在 Laravel 模型上设置属性的默认值[重复]

    这个问题在这里已经有答案了 如何在 Laravel 模型上设置属性的默认值 我应该在创建迁移时设置默认值还是应该在模型类中设置它 您还可以在模型中设置默认属性 gt protected attributes status gt self S
  • 部署闪亮应用程序时出错

    我正在尝试将闪亮的应用程序部署到闪亮的服务器中 但出现此错误 Error HTTP 400 POST https api shinyapps io v1 applications Validation Error 在控制台写入后 shiny
  • 在 PHP 中使用大括号构建代码

    是否可以将 PHP 中的代码片段括在括号内 不使用片段作为函数 以下代码的行为是否与没有大括号时的行为相同 或者根据括号内部或外部使用的代码类型可能会出现任何问题 例如 这将是 始终以与此相同的方式行事 Update 正如 My1 的评论中
  • WebClient 的 bodyToMono 对空主体的预期行为

    当 WebClient bodyToMono 遇到空主体时 预期的行为是什么 在我的具体示例中 我们正在检查从调用后返回的状态 如果是错误 则将其转换为我们的自定义错误格式 如果转换为自定义错误格式失败 我们会以自定义格式创建一个新错误来说