如何在 Spring Boot 中修改 Mono 对象的属性而不阻塞它
Posted
技术标签:
【中文标题】如何在 Spring Boot 中修改 Mono 对象的属性而不阻塞它【英文标题】:How to modify atributes of a Mono object without blocking it in Spring boot 【发布时间】:2019-02-23 21:06:55 【问题描述】:我最近开始使用响应式并创建了一个使用响应式流的简单应用程序。
我有以下代码,我通过 empID 获得了一名员工。只有当showExtraDetails
boolean 设置为true
时特别要求时,我才必须向我的 API 提供有关该员工的额外详细信息。如果它设置为 false,我必须在返回员工对象之前将额外的详细信息设置为 null。现在我正在使用流上的一个块来实现这一点。是否可以在没有阻塞的情况下执行此操作,以便我的方法可以返回 Mono。
以下是我做的代码。
public Employee getEmployee(String empID, boolean showExtraDetails)
Query query = new Query();
query.addCriteria(Criteria.where("empID").is(empID));
Employee employee = reactiveMongoTemplate.findOne(query, Employee.class, COLLECTION_NAME).block();
if (employee != null)
logger.info("employee found", empID);
if (employee != null && !showExtraDetails)
employee.getDetails().setExtraDetails(null);
return employee;
【问题讨论】:
【参考方案1】:试试这个,应该像这样工作,假设 reactiveMongoTemplate
是你的 mongo 存储库
return reactiveMongoTemplate.findById(empID).map(employee ->
if (!showExtraDetails)
employee.getDetails().setExtraDetails(null);
return employee;
);
【讨论】:
这里不需要 flatMap,map 也可以做同样的工作。 reactiveMongoTemplate.findById(empID).map(employee ->employee.getDetails().setExtraDetails(null)) 在空的情况下不执行map算子,所以map
这里是个不错的选择。
这是否意味着我不必进行单独的空检查? @BrianClozel
根据反应流规范,Mono
或 Flux
不允许提供 null
元素。所以 Mono
要么提供一个元素,要么什么都不提供 (Mono.empty()
)以上是关于如何在 Spring Boot 中修改 Mono 对象的属性而不阻塞它的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Boot 中使用 Web Client Mono 获取 API 响应错误消息
Spring Boot 2 - 将 Mono 转换为 rx.Observable?
spring boot webflux中如何根据条件进行两次删除操作?
如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?