【问题标题】:How to Update Object inside Mono<T>如何更新 Mono<T> 中的对象
【发布时间】:2017-10-14 15:52:25
【问题描述】:

我在处理程序中有以下代码,在提取用户后我想用密码更新用户对象 我该如何做类似下面的事情 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);
}

【问题讨论】:

  • 尝试使用 onNext : request.bodyToMono(User.class).doOnNext(user -> user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()))))

标签: spring-webflux


【解决方案1】:

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

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)。

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 2019-04-13
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多