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