Spring boot 如何将Flux all应用于返回Mono<;的谓词;布尔值>;?

Spring boot 如何将Flux all应用于返回Mono<;的谓词;布尔值>;?,spring-boot,kotlin,project-reactor,Spring Boot,Kotlin,Project Reactor,我有一个Spring Boot应用程序的过滤器列表,用于检查是否应启用登录用户,过滤器返回Mono 现在我想要的是将我的对象传递给所有这些对象,并链接过滤器。但关键是,如果任何过滤器返回false 这是我的过滤器界面 interface Filter { fun doFilter(obj: UserDetails): Mono<Boolean> } 接口过滤器{ FunDoFilter(对象:UserDetails):Mono } 这是我的登录方法代码 private f

我有一个Spring Boot应用程序的过滤器列表,用于检查是否应启用登录用户,过滤器返回
Mono

现在我想要的是将我的对象传递给所有这些对象,并链接过滤器。但关键是,如果任何过滤器返回
false

这是我的
过滤器
界面

interface Filter {
    fun doFilter(obj: UserDetails): Mono<Boolean>
}
接口过滤器{
FunDoFilter(对象:UserDetails):Mono
}
这是我的登录方法代码

private fun login(serverRequest: ServerRequest, securityFilters: List<SecurityFilter>): Mono<ServerResponse> {
    return serverRequest
            .bodyToMono(LoginPayload::class.java)
            .flatMap {
                userDetailsService.findByUsername(it.username)
                        .filter { userDetails -> passwordEncoder.matches(it.password, userDetails.password) }
            }
            ./////////////////////////TODO///////////////////////
            .flatMap {
                val jwt = jwtService.generateJwtToken(it)

                ServerResponse
                        .ok()
                        .cookie(ResponseCookie.from("jwt-access-token", jwt).build())
                        .build()
            }
            .switchIfEmpty(ServerResponse.status(HttpStatus.UNAUTHORIZED).build())
}
private-fun登录(serverRequest:serverRequest,securityFilters:List):Mono{
返回服务器请求
.bodyToMono(LoginPayload::class.java)
.平面图{
userDetailsService.findByUsername(it.username)
.filter{userDetails->passwordEncoder.matches(it.password,userDetails.password)}
}
..////////TODO///////////////////////
.平面图{
val jwt=jwtService.generateJwtToken(it)
服务器响应
.ok()
.cookie(ResponseCookie.from(“jwt访问令牌”,jwt).build())
.build()
}
.switchIfEmpty(ServerResponse.status(HttpStatus.UNAUTHORIZED).build())
}
我想用
TODO
部分的所有过滤器过滤我的对象,然后
仅当所有筛选器返回true时才执行最终的
flatMap
,如果其中一个筛选器失败,则停止筛选并发出
empty
。您可以将
filterWhen()
语句与
all()
结合使用,例如(在Java代码中):

我不认为有一个
all()
语句接受
Mono
,但是,只有一个
谓词
,因此这意味着您必须在结尾编写一个“奇怪”的语句,它不接受
result->result

.filterWhen(userDetails -> Flux
    .fromIterable(securityFilters)
    .flatMap(securityFilter -> securityFilter.doFilter(userDetails))
    .all(result -> result))