spring-webflux - 如何更新 Mono<T> 中的对象

标签 spring-webflux

我在处理程序中有以下代码,在提取用户后我想用密码更新用户对象 我该怎么做类似下面的事情 user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));

  public Mono<ServerResponse> saveUser(ServerRequest request) 
 {
    Mono<User> user = request.bodyToMono(User.class);
    // How to Set the Password to user 
    **//user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));**

    return ServerResponse.ok().body(this.userRepository.insert(user), User.class);
}

最佳答案

理论上,您可以执行以下操作:

public Mono<ServerResponse> saveUser(ServerRequest request) {
    Mono<User> user = request.bodyToMono(User.class)
        .map(user -> user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())));

    return ServerResponse.ok().body(this.userRepository.insert(user), User.class);
}

但这可以看作是一个特定的用例;我认为出于安全原因,密码编码器被设计为 CPU 密集型并且需要一些时间。不建议在 Web 交换管道上执行昂贵的 CPU 操作,因为您的应用程序无法很好地扩展:分配用于处理请求的少数线程将忙于执行身份验证工作而不是处理 HTTP 请求。

因此,在这种情况下,您可以在 .map 编码之前插入一个 publishOn(Schedulers.elastic()) 运算符;这将在弹性调度程序上调度那些 CPU 密集型操作(请参阅 Reactor reference doc on Schedulers )。

关于spring-webflux - 如何更新 Mono<T> 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46746429/

相关文章:

Spring MVC 到 Spring Webflux 迁移 - block 与订阅

spring-boot - Spring Webflux 上传大图片文件并以流方式使用 WebClient 发送文件

java - 处理客户端请求中的空通量体

spring-boot - 如何在Jboss或Tomcat上部署Spring Cloud Gateway 2.1?

java - 为什么 Spring 不为关系数据库提供响应式(Reactive)(非阻塞)客户端?

java - Flux 根据日期时间属性发出元素

java - 使用 Spring webflux 和 WebTestClient 获取请求属性

java - 如何在 spring webflux 响应式(Reactive) websocket 中发送列表

java - 如何比较 'Mono' 中的值?

java - 如何在 spring-mvc 中向 webflux 端点添加日志记录?