webflux Mono 响应为空

v78*_*v78 2 mono reactive-programming spring-boot spring-webflux

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

@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);
}
Run Code Online (Sandbox Code Playgroud)

端点/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()));
}
Run Code Online (Sandbox Code Playgroud)

终端

我面临的问题是响应正文为空,它应该是用户名。我还验证了当我返回硬编码字符串时,它会通过。当我依赖时它失败了jwtRequestMono.flatMap(...

![邮差

Mic*_*rry 5

这条线几乎肯定是你的失败:

jwtRequestMono.subscribe(v -> System.out.println(v.getUsername() + ":" + v.getPassword()));
Run Code Online (Sandbox Code Playgroud)

您的请求不能被多次订阅 - 因此在这一行上订阅它(它可以正常工作并按预期打印出值),然后框架订阅它,然后它就会崩溃。默认情况下发生这种情况时,我希望看到异常并返回 500 响应,因此您很可能在某个地方吞下了异常。

切勿在您自己的应用程序内订阅。这就是框架的工作。

相反,如果您想产生“副作用”,即在输入值时将其打印出来,则可以将其用作doOnNext()反应链的一部分:

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