如何在Mono中更新对象<t>

时间:2017-10-14 15:52:26

标签: spring-webflux

我在Handler中有以下代码,在解压缩用户后我想用密码更新用户对象 我如何做以下的事情 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);
}

1 个答案:

答案 0 :(得分:2)

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

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请求。

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