在 Spring web flux 中创建调用后如何进行调用?
How to make a call after create call in Spring web flux?
我有一个场景,用户在 table 中保存后,必须创建一个角色,角色 table 有一个外键引用,即 userId。
我在调试时尝试编写一些代码,我可以看到方法被调用,但查询没有执行。
以下是我的代码,
处理程序
Mono<User> userResponse = service.create(user);
return ServerResponse.status(HttpStatus.CREATED).body(userResponse, User.class).switchIfEmpty(ServerResponse.badRequest().build());
服务
Mono<User> user = this.repository
.create(User.builder().userName(user.getUserName()).build())
.convert().with(toMono());
return user.map(u -> {
this.saveRoleForUser(u);
return u;
});
public void saveRoleForUser(User u) {
this.repository.getRole("roleName").flatMap(i -> {
return this.repository.createRole(Roles.of(null, u.userId, i.getRoleId));
});
}
我可以看到 getRole("roleName") 在存储库中被调用,但查询没有执行。
存储库中没有错误,我猜这是因为线程阻塞导致此查询无法执行。我尝试寻找解决方案,但使用 flatMap 应该可以解决我所知道的问题。
我什至尝试从处理程序 class 调用“saveRoleForUser”,这也不起作用。
存储库
public Uni<Role> getRole(String roleName) {
CriteriaBuilder cb = this.sessionFactory.getCriteriaBuilder();
CriteriaQuery<Role> query = cb.createQuery(Role.class);
Root<Role> root = query.from(Role.class);
query.where(cb.equal(root.get("roleName"), roleName));
return this.sessionFactory.withSession(session -> session.createQuery(query).getSingleResultOrNull()).onItem()
.ifNull().switchTo(Uni.createFrom().item(Role.builder().build()));
}
PS: 正在创建用户,我没有收到任何错误或异常。
非常感谢任何帮助。
提前致谢。
下面是一些理想代码的示例代码。
这里要注意的最重要的事情是,我们现在将订阅从 saveRoleForUser
返回的 Mono
,这确保该函数内的操作将在订阅发生后执行。
public Mono<User> createUser() {
return this.repository
.create(User.builder().userName(user.getUserName()).build())
.convert().with(toMono())
.flatMap(u -> this.saveRoleForUser(u));
}
public Mono<User> saveRoleForUser(User u) {
this.repository.getRole("roleName").flatMap(i -> {
return this.repository.createRole(Roles.of(null, u.userId, i.getRoleId));
}).thenReturn(u);
}
我有一个场景,用户在 table 中保存后,必须创建一个角色,角色 table 有一个外键引用,即 userId。
我在调试时尝试编写一些代码,我可以看到方法被调用,但查询没有执行。 以下是我的代码,
处理程序
Mono<User> userResponse = service.create(user);
return ServerResponse.status(HttpStatus.CREATED).body(userResponse, User.class).switchIfEmpty(ServerResponse.badRequest().build());
服务
Mono<User> user = this.repository
.create(User.builder().userName(user.getUserName()).build())
.convert().with(toMono());
return user.map(u -> {
this.saveRoleForUser(u);
return u;
});
public void saveRoleForUser(User u) {
this.repository.getRole("roleName").flatMap(i -> {
return this.repository.createRole(Roles.of(null, u.userId, i.getRoleId));
});
}
我可以看到 getRole("roleName") 在存储库中被调用,但查询没有执行。
存储库中没有错误,我猜这是因为线程阻塞导致此查询无法执行。我尝试寻找解决方案,但使用 flatMap 应该可以解决我所知道的问题。 我什至尝试从处理程序 class 调用“saveRoleForUser”,这也不起作用。
存储库
public Uni<Role> getRole(String roleName) {
CriteriaBuilder cb = this.sessionFactory.getCriteriaBuilder();
CriteriaQuery<Role> query = cb.createQuery(Role.class);
Root<Role> root = query.from(Role.class);
query.where(cb.equal(root.get("roleName"), roleName));
return this.sessionFactory.withSession(session -> session.createQuery(query).getSingleResultOrNull()).onItem()
.ifNull().switchTo(Uni.createFrom().item(Role.builder().build()));
}
PS: 正在创建用户,我没有收到任何错误或异常。
非常感谢任何帮助。
提前致谢。
下面是一些理想代码的示例代码。
这里要注意的最重要的事情是,我们现在将订阅从 saveRoleForUser
返回的 Mono
,这确保该函数内的操作将在订阅发生后执行。
public Mono<User> createUser() {
return this.repository
.create(User.builder().userName(user.getUserName()).build())
.convert().with(toMono())
.flatMap(u -> this.saveRoleForUser(u));
}
public Mono<User> saveRoleForUser(User u) {
this.repository.getRole("roleName").flatMap(i -> {
return this.repository.createRole(Roles.of(null, u.userId, i.getRoleId));
}).thenReturn(u);
}