在 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);
}