我一直在为这个简单的代码上的简单问题而绞尽脑汁:
@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));
1条答案
按热度按时间qhhrdooz1#
如果
principal()
方法返回空Mono
,则不会调用flatMap()
方法,响应将为空。Mono.empty()
将返回一个Mono,该Mono在完成时不发射任何项目。您可以尝试
defaultIfEmpty()
方法。不确定这是否是你想要的,但类似于:
顺便说一句,Josh Bloch认为在大多数情况下,最好使用枚举而不是布尔值,我倾向于同意这一点,这可能与您的
FreshStatus
记录有关。