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

Spring WebFlux发布

夔高寒
2023-03-14

我正在使用WebClient发布API,但它没有返回任何内容。我假设线程保持打开状态,并且没有完成,因为我可以使用一个块来获得我想要的东西,但我对WebClient和异步的东西还是很陌生,所以我不能百分之百确定。

具体而言,我有以下方法:

public Mono<AppDto> applicationPost(AppDto dto){    
   return webClient.post()
            .uri("/api/doStuff")
            .contentType(MediaType.APPLICATION_JSON)
            .body(MonoConverter.appDtoToMono(dto), String.class)
            .exchange()
            .flatMap(clientResponse -> clientResponse.bodyToMono(Map.class))
            .map(MonoConverter::mapValueToAppDto);
}

其中,MonoConverter对映射值进行一些转换,因此这应该是无关的。上面返回了一个202 Accepted,但它没有返回值,也没有命中我的MapValueToAppldTo方法。但是,以下方法确实有效:

public Mono<AppDto> applicationPost(AppDto dto){
    Map map = webClient.post()
            .uri("/api/doStuff")
            .contentType(MediaType.APPLICATION_JSON)
            .body(MonoConverter.appDtoToMono(dto), String.class)
            .exchange()
            .flatMap(clientResponse -> clientResponse.bodyToMono(Map.class))
            .block();
    return Mono.just(MonoConverter.mapValueToAppDto(map));
}

我假设这是可行的,因为它使用block,但我有一个类似的get方法:

public Mono<AppDto> applicationGetOne(String appId){
    return webClient.get()
            .uri("/api/getOne/{0}",appId)
            .exchange()
            .flatMap(clientResponse -> clientResponse.bodyToMono(Map.class))
            .map(MonoConverter::mapValueToAppDto);
}

我更喜欢使用第一个片段,因为它不使用block,而且它更简单,格式与我的其他方法相同。

有没有人知道为什么第一个不起作用,或者知道我怎样才能让它起作用?

共有1个答案

丁均
2023-03-14

我找到了出现此问题的原因。它实际上与我的控制器有关(D'oh!)。对于post方法,我有绑定错误的验证,所以我只是返回一个响应实体,而没有给它一个类型。所以我在响应实体中添加了一个类型,这解决了问题。

例如:

@PostMapping(value="/post")
public ResponseEntity addThing(@Validated @RequestBody AppDto dto, BindingResult result){
    ...
}

是什么解决了这个问题:

@PostMapping(value="/post")
public ResponseEntity<Mono<?>> addThing(@Validated @RequestBody AppDto dto, BindingResult result){
    ...
}

我假设,由于最初没有指定类型,它没有使用mono响应所在的线程,因此我从未得到响应,但通过声明类型,Spring知道使用mono,从而允许它完成。

 类似资料:
  • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef

  • 我正在使用SpringWebSockets,我想从存储库返回一个项目列表 我怎么能在WebSocket会话中发送此列表 这是如何将项目列表发送到websocket的处理程序方法

  • 我希望为每个请求生成唯一的traceId,并将其传递给所有服务。在SpringMVC中,使用MDC上下文并将traceId放在头文件中相当容易,但在反应式堆栈中,由于ThreadLocal,它根本不起作用。 一般来说,我希望使用单个traceId记录我拥有的每个服务上的每个请求和响应,该traceId可以识别整个系统中的特定操作。 我试图根据文章创建自定义过滤器:https://azizulhaq

  • 我正在使用reactive mongodb开发简单的spring webflux演示应用程序,我想按姓名读取员工的所有数据,但不包括姓名字段“joe”、“Sara”、“joe”、“Sara”,我有如下代码: //仓库接口 //服务类

  • 在什么情况下Spring webflow会进行订阅?我在任何地方都读到必须有订阅,否则不会发生任何更改。在我使用Spring Webflow的短暂时间里,我从未在控制器或服务中见过。 我的疑问还在于,在使用flatMap时,。。。等订阅在什么时候进行? 我所读的并不能真正解决我的疑虑。 我知道这是一个异步问题,但每个flatMap都同时运行?。。。所以有时候我注意到一些数据是空的。

  • 我的理解是单声道 我说得对吗? 如果没有,单声道之间的区别是什么

  • 问题内容: 我正在使用spring-webflux WebClient (内部版本20170502.221452-172)访问Web应用程序,该Web应用程序生成Entry对象流(application / stream + json),如下所示: 尽管Entry对象的反序列化对于使用标准通用类型(包括Java时间(JSR-310)数据类型,如java.time.Instant)的POJO都可以正

  • 我正在使用spring-webflux WebClient(build 20170502.221452-172)访问一个Web应用程序,该应用程序生成一个条目对象流(application/stream+JSON),如下所示: 虽然条目对象的反序列化对于使用标准通用类型(包括Java.time.instant等Java time(JSR-310)数据类型)的POJO很好,但我想知道,为了将任何自定