我有一个反应式休息api(webflux),也使用

spring WebClient类,从其他休息服务请求数据.

简化设计:

@PostMapping(value = "/document")

public Mono save(@RequestBody Mono document){

//1st Problem: I do not know how to get the documentoOwner ID

//that is inside the Document class from the request body without using .block()

Mono documentOwner = documentOwnerWebClient()

.get().uri("/document-owner/{id}", document.getDocumentOwner().getId())

.accept(MediaType.APPLICATION_STREAM_JSON)

.exchange()

.flatMap(do -> do.bodyToMono(DocumentOwner.class));

//2nd Problem: I need to check (validate) if the documentOwner object is "active", for instance

//documentOwner and document instances below should be the object per se, not the Mono returned from the external API

if (!documentOwner.isActive) throw SomeBusinessException();

document.setDocumentOwner(documentOwner);

//Now I can save the document in some reactive repository,

//and return the one saved with the given ID.

return documentRepository.save(document)

}

换句话说:我理解(几乎)单独的所有反应性示例,但我无法将它们全部放在一起并构建一个简单的用例(get – > validate – > save – > return)而不会阻塞对象.

我越接近的是:

@PostMapping(value = "/document")

public Mono salvar(@RequestBody Mono documentRequest){

return documentRequest

.transform(this::getDocumentOwner)

.transform(this::validateDocumentOwner)

.and(documentRequest, this::setDocumentOwner)

.transform(this::saveDocument);

}

辅助方法有:

private Mono getDocumentOwner(Mono document) {

return document.flatMap(p -> documentOwnerConsumer.getDocumentOwner(p.getDocumentOwnerId()));

}

private Mono validateDocumentOwner(Mono documentOwner) {

return documentOwner.flatMap(do -> {

if (do.getActive()) {

return Mono.error(new BusinessException("Document Owner is Inactive"));

}

return Mono.just(do);

});

}

private DocumentOwnersetDocumentOwner(DocumentOwner documentOwner, Document document) {

document.setDocumentOwner(documentOwner);

return document;

}

private Mono saveDocument(Mono documentMono) {

return documentMono.flatMap(documentRepository::save);

}

我正在使用Netty,SpringBoot,Spring WebFlux和Reactive Mongo Repository.但是有一些问题:

1)我收到错误:

java.lang.IllegalStateException:只允许一个连接接收订阅者.也许是因为我使用相同的documentRequest转换和setDocumentOwner.我真的不知道.

2)没有调用setDocumentOwner方法.因此,不保存要保存的文档对象.我相信可以有更好的方法来实现这个setDocumentOwner().

谢谢

java webclient使用,java – Spring Reactive WebClient相关推荐

  1. Spring WebClient和Java日期时间字段

    WebClient是Spring Framework的反应式客户端,用于进行服务到服务的调用. WebClient已成为我的实用工具,但是最近我意外地遇到了一个问题,即它处理Java 8时间字段的方式 ...

  2. webClient请求JAVA超时解决方案

    webClient请求JAVA超时解决方案 参考文章: (1)webClient请求JAVA超时解决方案 (2)https://www.cnblogs.com/flyfish2012/p/564987 ...

  3. Spring的WebClient基本使用

    WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具.它的响应式编程的基于Reactor的.WebClient中提供了标准H ...

  4. 集成Java内容仓库和Spring

    保存各种信息对于应用程序来说非常平常,大多数时候它们是保存在关系数据库中.数据库处理规范数据类型十分在行,但是在处理如图像.文档等二进制数据时却不是那么得心应手.尽管可以用文件系统作为替代--而且它们 ...

  5. 在普通Java类里使用spring里注入的service、dao等

    版权声明:本文为博主武伟峰原创文章,转载请注明地址http://blog.csdn.net/tianyaleixiaowu. 在spring管理的web项目里,譬如Struts和spring的项目,配 ...

  6. java was datasource_使用Spring Boot配置Druid时dataSource无法被autowired

    配置好了dataSource之后,想测试一下有没有配置成功 package com.yang.Controller; import com.alibaba.druid.pool.DruidDataSo ...

  7. java 获取spring对象数组_解析Java中如何获取Spring中配置的bean

    解析Java中如何获取Spring中配置的bean Java中如何获取Spring中配置的bean?下面是由百分网小编为大家整理的解析Java中如何获取Spring中配置的bean,喜欢的可以收藏一下 ...

  8. Java开源项目:Spring Integration

    2019独角兽企业重金招聘Python工程师标准>>> Java开源项目:Spring Integration http://www.importnew.com/16538.html ...

  9. spring 加载java类_在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤 发布于 2020-7-7| 复制链接 基于Java配置选项,可以编写大多数的Spring不用配置XML,下面 前言JavaConfig 原来是 Spr ...

最新文章

  1. Eclipse SVN插件冲突导致不能使用解决办法
  2. 开闭鸿蒙都只为风味情浓,开辟鸿蒙,谁为情种?都只为风月情浓。
  3. MAC OS中的dylib 的@rpath和@loader_path小问题
  4. 因子和(类素数筛选法)
  5. Oracle 表空间的段管理
  6. Mysql ---Sqlserver数据迁移到Mysql(Mysql建表迁移数据)
  7. python房子代码_基于python的链家小区房价爬取——仅需60行代码!
  8. 用SVD和字典学习方法重建图像(cifar-10图片集)
  9. vue-cli项目在IE下运行钩子函数抛出异常“ReferenceError: “Promise”未定义“”的解决办法
  10. 关于2020新版idea,maven工程依赖成功导入、但运行找不到jar包问题解决。
  11. 简单调整配置深度Linux-15迅速开始学习工作
  12. Windows系统目录下文件夹汇总
  13. Linux iptable文档
  14. java满天星星代码_纯Java代码实现流星划过天空
  15. BeanUtils.populate()抛出异常处理
  16. 微信小程序之如何实现一寸照片换底色(附小程序成品)
  17. OUTER JOIN的应用场景
  18. python pip安装第三方包速度慢,这篇博客给你安排清楚了
  19. hp vse虚拟服务器,HP9000用户升级硬件平台的捷径
  20. linux手写数字识别,mnist手写数字识别与图片预处理

热门文章

  1. [创业-19]:财务报表 - 所有者权益之实收资本
  2. 【模拟 IC】电荷泵的基础知识之正电荷泵
  3. 学弟啊,你代码能不能不要写得这么烂?!--文末送书
  4. 机器狗病毒专杀和机器狗病毒样本研究
  5. 高中必备学习软件_9个学习高中必备学习软件
  6. 榆林市科技馆项目变电所运维的研究与应用
  7. AcrelCloud-1000变电所运维云平台一个智能的、适应时代变化发展的运维管理系统
  8. Fluent软件并行效率测试
  9. 3GPP25.321中HSDPA的Mac-hs实体研究
  10. 一步一步教你用 Python 开发战棋游戏,仿英雄无敌