Spring Security Spring Webflux服务器响应为空

bsxbgnwa  于 2023-01-26  发布在  Spring
关注(0)|答案(1)|浏览(292)

我一直在为这个简单的代码上的简单问题而绞尽脑汁:

@Bean
public RouterFunction<ServerResponse> refresh() {
    return route(GET("/api/refresh"), (request) ->
            request.principal().or(Mono.empty()).flatMap((it) -> {
                System.out.println(it);

                return ServerResponse.ok().body(Mono.just(new FreshStatus(true)), FreshStatus.class);
            }));
}

record FreshStatus(boolean isFresh) {}

我有两个问题:

  • 如果未进行身份验证,则不会调用flatMap内的代码,尽管使用了.or子句
  • 当进行身份验证时,flatMap代码被调用,但是服务器响应只是空白。

两种情况下的响应均为200 OK。
我已经尝试使用SecurityContextHolder,没有任何变化。
新代码为:

ServerResponse.ok().body(request.principal()
                    .map(it -> new FreshStatus(true))
                    .defaultIfEmpty(new FreshStatus(false)), FreshStatus.class));
qhhrdooz

qhhrdooz1#

如果principal()方法返回空Mono,则不会调用flatMap()方法,响应将为空。Mono.empty()将返回一个Mono,该Mono在完成时不发射任何项目。
您可以尝试defaultIfEmpty()方法。
不确定这是否是你想要的,但类似于:

return route(GET("/api/refresh"), (request) ->
            request.principal().defaultIfEmpty(new FreshStatus(false))
            .flatMap((it) -> {
                System.out.println(it);

                return ServerResponse.ok().body(Mono.just(it), FreshStatus.class);
            }));

顺便说一句,Josh Bloch认为在大多数情况下,最好使用枚举而不是布尔值,我倾向于同意这一点,这可能与您的FreshStatus记录有关。

相关问题