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

Mongo Flux/Mono get对象

狄峻熙
2023-03-14

我想从Flux/Mono中获取对象。我使用

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>

我会这样做:

    Mono<UserEntity> byEmail = userRepository.findByEmail(userDto.getEmail());
    UserEntity block = byEmail.block();

我有错误:

java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-3

为什么?有什么不同的方法来获取对象?

在反应式编程中,如何做到:在RequestBody中,您有UserDto。

如果不创建用户,请检查数据库中是否存在电子邮件。

 return userRepository.findByEmail(userDto.getEmail())
    //rethrow DB errors as BadRequestException, except user exists
    .onErrorResume(t -> Mono.error(new BadRequestException()))
    //throwing in map is converted to onError signal
    .map(ifItGoesThereItExist-> { throw new UserByEmailExistException(); })
    //switchIfEmpty to replace an empty source with a different Mono
    .switchIfEmpty(createUser(userDto))
    //at this point, map can only receive an onNext from the createUser
    .map(u -> new ResponseEntity(u, HttpStatus.CREATED))
    ;

共有1个答案

江佐
2023-03-14

你似乎已经找到了一个答案,但让我详细说明一下。

为什么你不能阻挡

您收到的错误消息表明您尝试在不适应阻塞的特定Thread(或线程池)中恢复阻塞行为。这是Spring Webflow(以及在封面下的Netty)用于处理应用程序中的每个传入请求的线程。因此,如果您阻止它,您将完全阻止您的应用程序提供新请求。

您的答案和一些小的改进

首先,可以简化映射,因为通量或单声道中不允许有空值。如果该值不以DB为单位,Spring数据的反应CRUDepository将返回一个空的单声道,不要与发出null的单声道混淆:

---( null )---|->
onNext(null), onComplete() // onNext(null) being forbidden

vs公司

---|->
onComplete()

此外,我认为使用onErrorResume,除了“用户存在”情况外,您打算包装DB错误?如果是这样,则此错误恢复的位置是错误的,因为它类似于捕获(抛出e),也将捕获UserByEmailExistException。把它放在地图的前面。您也可以从地图内直接投掷。

因此,这归结为检测空的单声道与有值的单声道,将空的单声道替换为异步DB存储,将有值的单声道替换为错误:

太长别读密码

return userRepository.findByEmail(userDto.getEmail())
        //rethrow DB errors as BadRequestException, except user exists
        .onErrorResume(t -> Mono.error(new BadRequestException()))
        //throwing in map is converted to onError signal
        .map(ifItGoesThereItExist-> { throw new UserByEmailExistException(); })
        //switchIfEmpty to replace an empty source with a different Mono
        .switchIfEmpty(createUser(userDto))
        //at this point, map can only receive an onNext from the createUser
        .map(u -> new ResponseEntity(u, HttpStatus.CREATED))
        ;
 类似资料:
  • 问题内容: 问题在于确定以下符号之间的权衡: 基于JSON : 基于数组 : 关于同一问题的这篇文章,我已经决定(在前端)使用JSON对象表示法而不是对象数组,因为它符合我的要求,更好的性能和更少的浏览器代码。 但是问题在于列表本身不是静态的。我的意思是,该列表正在生成,即从DB(NoSQL)获取/存储,并通过服务器上的JavaAPI为新条目创建。我无法决定在后端应使用哪种表示法(最终也会影响UI

  • File 对象 File 对象代表一个文件,用来读写文件信息。它继承了 Blob 对象,或者说是一种特殊的 Blob 对象,所有可以使用 Blob 对象的场合都可以使用它。 最常见的使用场合是表单的文件上传控件(<input type="file">),用户选中文件以后,浏览器就会生成一个数组,里面是每一个用户选中的文件,它们都是 File 实例对象。 // HTML 代码如下 // <input

  • URL 是互联网的基础设施之一。浏览器提供了一些原生对象,用来管理 URL。 Location 对象 Location对象是浏览器提供的原生对象,提供 URL 相关的信息和操作方法。通过window.location和document.location属性,可以拿到这个对象。 属性 Location对象提供以下属性。 Location.href:整个 URL。 Location.protocol:

  • ArrayBuffer 对象 ArrayBuffer 对象表示一段二进制数据,用来模拟内存里面的数据。通过这个对象,JavaScript 可以读写二进制数据。这个对象可以看作内存数据的表达。 这个对象是 ES6 才写入标准的,普通的网页编程用不到它,为了教程体系的完整,下面只提供一个简略的介绍,详细介绍请看《ES6 标准入门》里面的章节。 浏览器原生提供ArrayBuffer()构造函数,用来生成

  • window.navigator属性指向一个包含浏览器和系统信息的 Navigator 对象。脚本通过这个属性了解用户的环境信息。 Navigator 对象的属性 Navigator.userAgent navigator.userAgent属性返回浏览器的 User Agent 字符串,表示浏览器的厂商和版本信息。 下面是 Chrome 浏览器的userAgent。 navigator.user

  • 问题内容: 就像是 这是我想象的格式,但事实并非如此。什么会退回到对象的父级? 问题答案: JavaScript本身不提供此功能。而且我怀疑您是否可以创建这种类型的功能。例如: 鲍比属于谁?

  • 问题内容: 我正在上最后一堂课。我复制的阵列使用对象,并且当我改变一个中复制的数组对象,它就会被反映原始数组英寸 我正在输出, 我应该在所有情况下都得到25和26的输出,对吗?为什么会改变? 问题答案: System.arrayCopy()复制对象还是对对象的引用? 参考,这是一个 浅表 副本。出乎意料的是,文档没有明确地说,只是隐式地说,因为他们 只 谈论复制数组元素,而不是递归地复制他们引用的

  • 问题内容: 谁能向我解释这个错误是什么意思?对于此方面的任何帮助,我将非常感谢。 我为此使用的Jquery代码是这样。 问题答案: 检查表单,查看是否有ID为或ID 为的ID 。 这将一个属性设置到,所以不能被执行,其是在表格元件的原型函数。 例: js: jQuery的方法将在原始dom元素上调用,因此将发生错误。