Jos*_*ang 3 java reactive-programming spring-boot spring-webflux
我尝试制作 spring boot webflux 的处理程序和路由器类。模型类是用户类。代码是
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Document(collection="Users")
public class User {
@Id
private String _id;
@Indexed(unique = true)
private Long id;
@Indexed(unique=true)
private String username;
private String password;
private String email;
private String fullname;
private String role;
}
Run Code Online (Sandbox Code Playgroud)
下面是 webflux 项目的处理程序类。在register方法中,我制作了id重复测试代码。但这是完全错误的。
@Component
public class UserHandler {
@Autowired
private UserReactiveMongoRepository userRepository;
public Mono<ServerResponse> register(ServerRequest request) {
Mono<User> monoUser = request.bodyToMono(User.class);
String id = monoUser.map(u -> u.get_id()).toString();
if(userRepository.existsById(id) == null)
return ServerResponse.ok().build(userRepository.insert(monoUser));
return ServerResponse.ok().build();
}
}
Run Code Online (Sandbox Code Playgroud)
我想从 spring webflux 的 Mono 中提取用户名或 id 字符串。任何意见都将被需要。我被这部分困住了。
小智 5
这里错误的事情之一是这样的String id = monoUser.map(u -> u.get_id()).toString();。toString 将返回一个类似“Mono@13254216541”的字符串,因为您正在调用 Mono.toString。
另一件事是,您不应该在函数主体中使用请求的数据,而应该在 map 或 flatMap 函数中使用。
你可以用类似的东西替换它(我是用头做的,所以它可能不是 100% 语法正确):
Mono<User> userMono = request.bodyToMono(User.class);//Create a Mono<User>
userMono.map((user) -> { //In the map method, we access to the User object directly
if(user != null && user.getId() != null){
return userRepository.insert(user); // Insert User instead of Mono<User> in your repository
}
return null;
}) //This is still a Mono<User>
.map(insertedUser -> ServerResponse.ok(insertedUser)) //This is a Mono<ServerResponse>
.switchIfEmpty(ServerResponse.ok());
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
3003 次 |
| 最近记录: |