webflux Mono 响应为空

webflux Mono response empty

我的项目中有一个非常简单的 spring webflux rest 端点。

@Bean
public RouterFunction authRoute() {
    return RouterFunctions.route(POST("/auth/signin").and(accept(APPLICATION_JSON)), this::signIn)
            .andRoute(POST("/auth/signup").and(accept(APPLICATION_JSON)), this::signUp)
            .andRoute(POST("/auth/test").and(accept(APPLICATION_JSON)), this::test);
}

并且 /auth/test 端点仅使用提供的用户名回复。

public Mono<ServerResponse> test(ServerRequest request) {
    System.out.println("Start test ");
    Mono<JwtRequest> jwtRequestMono = request.bodyToMono(JwtRequest.class);
    jwtRequestMono.subscribe(v -> System.out.println(v.getUsername() + ":" + v.getPassword()));
    return jwtRequestMono
            .flatMap(j -> ServerResponse.ok().contentType(APPLICATION_JSON).bodyValue(j.getUsername()));
}

我遇到的问题是响应体是空的,应该是用户名。我还验证了当我 return 硬编码字符串时,它通过了。当我依赖 jwtRequestMono.flatMap(...

时它失败了

这条线几乎可以肯定是你的垮台:

jwtRequestMono.subscribe(v -> System.out.println(v.getUsername() + ":" + v.getPassword()));

您的请求无法被多次订阅 - 所以 在此行订阅它(它可以正常工作并按预期打印出值),然后 framework订阅了,炸了。我希望在默认情况下发生这种情况时看到异常并返回 500 响应,所以您可能在某处吞下了异常。

永远不要在您自己的应用程序中订阅。那是框架的工作。

相反,如果您希望有一个 "side-effect" 在其中打印值,那么请使用 doOnNext() 作为反应链的一部分:

return jwtRequestMono
        .doOnNext(v -> System.out.println(v.getUsername() + ":" + v.getPassword()))
        .flatMap(j -> ServerResponse.ok().contentType(APPLICATION_JSON).bodyValue(j.getUsername()));