繁体   English   中英

如何从Mono获得身体 <ClientResponse> ?

[英]How to get body from Mono<ClientResponse>?

我正在尝试实现BodyExtractor接口,将Mono <ClientResponse>的正文作为对象而不是Mono的对象。
我找不到BodyExtractor实现的任何示例。 我想知道这是实现它的一个好主意,还是有其他方法可以使身体成为对象。

以下是我目前拥有的代码行

public Mono&ltResponseEntity&ltMono&ltJsonNode>>> processUnmappedApiRequest(ServerHttpRequest request, JsonNode body) {
        RequestData reqData = this.prepareReqMetadata(request, body);
        Mono&ltClientResponse> response = commonConnector.getApiResponse(reqData);

        return response.map(respData ->  {
            int latestVersion = respData.headers().header("version").size() == 0 ? getLatestVersion(request) :
                    Integer.parseInt(respData.headers().header("version").get(0));
            List converterList;
            if((converterList = converterSequenceProvider.getConverterList(reqData.getRequestPath(), latestVersion, reqData.getVersion())) != null){
                return ResponseEntity.ok().body(respData.bodyToMono(JsonNode.class).map(respBody -> convertToDesiredVersion(converterList, respBody)));
            }
            return ResponseEntity.ok().body(respData.bodyToMono(JsonNode.class));
        });
    }

在此方法中,我的返回类型为Mono <ResponseEntity <Mono <JsonNode >>>,并且我尝试将其转换为Mono <ResponseEntity <JsonNode >>,因为我的团队不同意Mono中的Mono。

因此,这里的要点是我不想使用bodyToMono方法,并且不确定如何使用body方法。

请帮我在这里。

如果您尝试仅返回一个Mono对象,则可以使用flatMap方法而不是map ,因此可以避免使用Mono<Mono<X>>而只获取Mono<X>

map

通过对其应用同步功能来变换此Mono发出的项目。

flatMap

异步转换此Mono发出的项目,返回另一个Mono发出的值(可能会更改值类型)。

另外, ServerResponse.BodyBuilder syncBody上有一个方法,该方法可以获取普通主体并将其返回到Mono Map函数的参数已经是未包装的对象,因此您可以执行以下操作:

JsonNode jsonNode=transform(clientResponse);
return ResponseEntity.ok().syncbody(jsonNode);

如何从 Mono 获取 object<object><div id="text_translate"><p> 我正在使用 WebClient 与其他微服务进行通信。 我想通过 id 从远程 UserService 获取用户然后我想将此用户信息发送到另一个远程服务问题是我得到的响应为 Mono 但我必须以用户 object 的身份获取它。我尝试了 block() 但它没有它总是抛出这个错误: java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread here is a code</p><pre class="lang-java prettyprint-override"> public User findUserById(String user_id){ return webClientBuilder.build().get().uri("http://localhost:7854/"+user_id).retrieve().onStatus(httpStatus -> HttpStatus.NOT_FOUND.equals(httpStatus),clientResponse -> Mono.empty()).bodyToMono(User.class).block(); }</pre><p> 我正在使用 Spring Boot 2.5.4 Java 11</p></div></object>

[英]How to get the object from Mono<Object>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 从 SpringBootApplication 中的 ClientResponse 获取正文 RestEasy:如何验证ClientResponse正文? 如何最好地从 Spring WebClient 的 ClientResponse 获取字节数组? 如何在 Spring 测试环境中反序列化 ClientResponse 主体? 如何从单声道中获取价值 如何从 Spring 中提取响应 header 和状态码 5 WebClient ClientResponse Java Spring:如何访问来自ClientResponse 的原始请求? 如何使用 Spring ClientResponse 使用 Map? 如何从 Mono 获取字段值<class> ?</class> 如何从 Mono 获取 object<object><div id="text_translate"><p> 我正在使用 WebClient 与其他微服务进行通信。 我想通过 id 从远程 UserService 获取用户然后我想将此用户信息发送到另一个远程服务问题是我得到的响应为 Mono 但我必须以用户 object 的身份获取它。我尝试了 block() 但它没有它总是抛出这个错误: java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread here is a code</p><pre class="lang-java prettyprint-override"> public User findUserById(String user_id){ return webClientBuilder.build().get().uri("http://localhost:7854/"+user_id).retrieve().onStatus(httpStatus -> HttpStatus.NOT_FOUND.equals(httpStatus),clientResponse -> Mono.empty()).bodyToMono(User.class).block(); }</pre><p> 我正在使用 Spring Boot 2.5.4 Java 11</p></div></object>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM