我需要对两个Monos. 困难在于一个取决于另一个的结果。
让我解释:
我有一个
Mono<User>(我从一个ServerRequest;中得到它User是一个 POJO)。我需要能够从上面提取用户电子邮件
Mono并将其传递给以UserRepository检查电子邮件是否已存在于数据库中。如果用户已经存在,我会抛出一个
400错误;否则,我将保存包含在ServerRequest.
这是我尝试过的handler:
public Mono<ServerResponse> saveUser(ServerRequest serverRequest) {
return serverRequest.bodyToMono(User.class)
.flatMap(user -> userRepository
.findByEmail(user.getEmail())
.flatMap(foundUser -> {
if (foundUser != null) {
System.out.println("found:" + foundUser);
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Email already exists");
} else {
System.out.println("creating" + user);
return status(CREATED).contentType(APPLICATION_JSON).body(userRepository.save(user), User.class);
}
}));
}
User:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@Id
private Integer id;
@Size(min = 2)
private String firstName;
@Size(min = 2)
private String lastName;
@Email
private String email;
}
UserRepository:
public interface UserRepository extends ReactiveCrudRepository<User, Long> {
@Query("select id, first_name, last_name, email from user u where u.email = :email")
Mono<User> findByEmail(String email);
}
但是,我的订阅似乎存在问题:System.out.println调用端点时没有调用 my 。有人可以帮忙吗?
编辑1:这是router调用上述handler方法:
@Configuration
public class UserRouter {
@Bean
public RouterFunction<ServerResponse> route(UserHandler userHandler) {
return RouterFunctions.route()
.GET("/api/user", accept(APPLICATION_JSON), userHandler::getUsers)
.POST("/api/sign-up", accept(APPLICATION_JSON), userHandler::saveUser)
.build();
}
}