当前位置: 首页 > 知识库问答 >
问题:

webflux Mono响应为空

酆君墨
2023-03-14

我的项目中有一个非常简单的SpringWebFlux restendpoint。

@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);
}

endpoint只需使用提供的用户名回复即可。

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()));
}

我面临的问题是响应体是空的,应该是用户名,我还验证了当我返回硬编码字符串时,它通过了,当我依赖jwtRequest estMono.flatMap(...

共有1个答案

澹台蕴藉
2023-03-14

这句话几乎可以肯定是你的垮台:

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

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

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

相反,如果您想在值输入时打印它们的“副作用”,请使用doOnNext()作为反应链的一部分:

return jwtRequestMono
        .doOnNext(v -> System.out.println(v.getUsername() + ":" + v.getPassword()))
        .flatMap(j -> ServerResponse.ok().contentType(APPLICATION_JSON).bodyValue(j.getUsername()));
 类似资料:
  • 我有一个用Java编写的Spring Boot应用程序,它是一个REST API。该服务(Svc A)调用REST API服务(Svc B),该服务也是用Java编写的Spring Boot应用程序。当没有找到数据时,Svc B返回404状态码。我需要将此响应更改为200状态代码,并返回一个空响应对象。我不确定是否或如何做到这一点。 我可以捕捉错误,并确定404是否是这个没有数据发现的错误。但是,

  • 我的环境: Shop RestController:Spring Boot 在localhost laptopn ubuntu 18:04 在localhost desktop pc windows 10上 邮递员要求: Spring引导控制器: 我已经尝试使用Observable和any以及HttpHeaders和Application/JSON,但响应相同。

  • 我正在从服务器下载文件。我用排球来做。 这是我的代码 以下是错误侦听器的错误消息在一些弱网络连接上,我收到以下逻辑消息 我不明白失败的原因是什么,因为大多数错误消息都返回null。我很确定这是因为请求超时,我知道如何增加超时,但是我应该在错误侦听器中编写什么代码,以便在出现错误时获得正确的错误消息。

  • 我是VueJs的新手 "https://github.com/coreui/coreui-free-vue-admin-template/blob/master/src/views/base/Tables.vue" 在上面的vue中。我想动态地将数据分配给“someData”变量。我试着像下面那样把它绑起来,但没用。

  • 问题内容: 我无法使用RestTemplate(org.springframework.web.client.RestTemplate)应对额外的弹簧行为,但没有成功。 我在代码下面的Hole应用程序中使用,并且始终会收到XML响应,该响应会解析并评估其结果。 但是无法确定为什么执行后服务器响应为JSON格式: 我已经在较低级别的RestTemplate上进行了调试,内容类型为XML,但是不知道为

  • 我正在我的Android项目中使用Retrofit库。我有一个rest服务器,试图请求它的登录方法。如果登录失败,服务器将返回401错误和json中的详细消息。我的问题是,在我的Nexus 5和Android 5.0上,它工作得很好,我可以从RetrofitError对象获取响应体。但在其他设备上,例如带有Android 4.2.2的Sony Xperia M,在同一请求中,我得到了异常和Retr