当前位置: 首页 > 知识库问答 >
问题:

如何在另一个具有循环依赖关系的mono中使用mono

高森
2023-03-14

我有一个spring boot反应式应用程序。如果用户还不存在,我想在其中实现创建用户。这样地:

fun userAlreadyExist() = Mono.error<UserDTO>(UsernameAlreadyExistException())

fun create(userDTO: Mono<UserDTO>): Mono<Void> {
    return userDTO.filter { userRepository.existsByNameIgnoreCase(it.username).block() == false }
            .switchIfEmpty(userAlreadyExist())
            .flatMap { createNewUser(it).then() }

我真正不喜欢的是我需要使用。过滤器内的block()。有没有更好的方法?

最大的问题是两者都有循环依赖关系,因为UserRepository需要知道用户名,而userDTO stream需要知道这是否已经存在并返回mono。

共有2个答案

上官正志
2023-03-14

问题是,我使用的是filter(),而我应该使用的是filterWhen(),它计算异步Monos。

我所做的:

fun create(userDTO: Mono<UserDTO>): Mono<Void> {
    return userDTO.filterWhen { innerUserDTO ->
        userRepository.existsByNameIgnoreCase(innerUserDTO.username).map { !it }
    }
            .flatMap { createNewUser(it) }
            .switchIfEmpty(userAlreadyExist())
            .then()
}
严俊彦
2023-03-14

这里的逻辑看起来有点奇怪-您可能可以这样做:

fun create(userDTO: Mono<UserDTO>): Mono<Void> {
    return userDTO.flatMap {
               userRepository.findByNameIgnoreCase(it.username)
                             .flatMap(user -> userAlreadyExist())
                             .switchIfEmpty(createNewUser(it)) 
           }.then()
 类似资料:
  • 问题内容: 我最近一直在使用nodejs,并且仍然要处理模块系统,因此很抱歉这是一个明显的问题。我想要大致如下的代码: a.js (主文件与节点一起运行) b.js 我的问题似乎是我无法从ClassB实例中访问ClassA实例。 有没有正确/更好的方法来构造模块来实现我想要的?是否有更好的方式在模块之间共享变量? 问题答案: 尽管node.js确实允许循环依赖,但正如您所发现的那样,它可能很杂乱,

  • 我最近一直在使用nodejs,并且仍然在掌握模块系统,所以如果这是一个明显的问题,请原谅。我想要大致如下的代码: a.js(主文件与节点一起运行) b.js 我的问题似乎是我无法从ClassB的实例中访问ClassA的实例。 有没有正确/更好的方法来构建模块以实现我想要的?有没有更好的方法在模块之间共享变量?

  • 问题内容: 在我的系统中,我在浏览器中加载了许多“类”,在开发过程中,每个类都有单独的文件,并串联在一起进行生产。加载它们时,它们在全局对象(这里)上初始化一个属性,如以下示例所示: 我考虑使用James Burke的建议,而不是使用自己的全局对象,而是考虑使每个类都具有自己的AMD模块: 问题在于,以前在Employee和Company之间没有声明时间依赖关系:您可以按所需的顺序放置声明,但是现

  • 问题内容: 我有一个简单的节点应用程序,它对github上另一个应用程序具有单一依赖性。使用可以很好地安装依赖项,但是当我尝试在其中安装某些东西时,它说不可用。例如,github应用程序将Mongoose安装为依赖项。我认为该父应用程序可以访问该模块,因为它位于子模块中: 结构看起来像这样: 我是否只需要在父级应用程序中同时包含猫鼬作为依赖项,还是可以通过子级方式访问该模块? 问题答案: 我是否只

  • 异常0:org.jboss.weld.exceptions.deploymentexception:weld-001443:伪作用域bean具有循环依赖关系。依赖关系路径:-托管Bean[class com.my.own.bounded_contexts.client.cache.CacheClientCommPriorizedAcceptRequestService],带有限定符[@any@de

  • 我知道循环依赖通常是不被鼓励的——然而,在C#和TypeScript中,我有时发现它们很有用。这可能是因为我缺乏python方面的经验,也可能是因为我的思维方式不对,或者是因为我没有找到谷歌应该使用的词语。我将如何解决以下问题? 我试图创建一个处理请求的类,每个处理事件都伴随着一个上下文。所以,我想创建handler类和context类,但它们是依赖的,linter在第2行给了我问题,说Handl