java - 不适当的阻塞方法调用(使用 reactor.core.publisher.Mono)
问题描述
你能帮我理解你为什么给我这个警告吗?
本质上,这个 POST 调用给了我结果(userPayload),我在进一步的 POST 调用中重复使用并将数据保存到 db。
怎么了?
公共 Mono<ResponseEntity> createUser(UserRequest requestPayload) {
return webClientBuilder
.build()
.post()
.uri(settings.getUrl())
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.header("Authorization", settings.getApiToken())
.body(BodyInserters.fromValue(requestPayload))
.exchange()
.flatMap(clientResponse -> {
if (clientResponse.statusCode().isError()) {
return clientResponse.bodyToMono(Error.class)
.flatMap(error -> Mono.error(new CustomException(clientResponse.statusCode(), error)));
} else {
return clientResponse.bodyToMono(UserPayload.class)
.flatMap(user -> {
saveNewUser(user);
validateUser(user.getLinks());
return Mono.just(new ResponseEntity<>(user, HttpStatus.OK));
}).switchIfEmpty(Mono.error(new NotFoundCustomException("User Payload not found!")));
}
});
}
第二种方法:
私人单声道验证用户(字符串 uri){
webClientBuilder
.build()
.post()
.uri(uri)
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.header("Authorization", settings.getApiToken())
.retrieve()
.onStatus(HttpStatus::isError, clientResponse -> clientResponse.bodyToMono(Error.class)
.flatMap(error -> Mono.error(new CustomException(clientResponse.statusCode(), error)))
).bodyToMono(Void.class);
}
解决方案
最后,我这样解决了:
public Mono<ResponseEntity<UserPayload>> createUser(UserRequest requestPayload) {
return webClientBuilder
.build()
.post()
.uri(settings.getUrl())
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.header("Authorization", settings.getApiToken())
.body(BodyInserters.fromValue(requestPayload))
.retrieve()
.onStatus(HttpStatus::isError, errorResponse -> errorResponse
.bodyToMono(Error.class)
.flatMap(error -> Mono.error(new CustomException(errorResponse.statusCode(), error))))
.bodyToMono(UserPayload.class)
.flatMap(user -> {
return Mono.fromSupplier(()->repository.save(convertFromPayloadUser(user)))
.subscribeOn(Schedulers.boundedElastic())
.then(validateUser(user.getLinks()))
.then(Mono.just(new ResponseEntity<>(user, HttpStatus.OK)));
}).switchIfEmpty(Mono.error(new NotFoundCustomException("User Payload not found!")));
}
第二种方法:
private Mono<Void> validateUser(String uri) {
return webClientBuilder
.build()
.post()
.uri(uri)
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.header("Authorization", settings.getApiToken())
.retrieve()
.onStatus(HttpStatus::isError, clientResponse -> clientResponse.bodyToMono(Error.class)
.flatMap(error -> Mono.error(new CustomException(clientResponse.statusCode(), error)))
).bodyToMono(Void.class);
}
推荐阅读
- r - R 中的 nlminb() 函数返回 NA/NaN 函数评估错误 - 我也尝试限制参数搜索空间
- python - Python Text 小部件仅在窗口中打开
- c - Xlib 和 BadWindow
- javascript - 在内部组件的输入标签中测试 onChange 函数 - React
- c++ - C++ 无法链接最基本的应用程序
- android - Volley android http 到 https 重定向
- three.js - 无法从 Marmoset 工具包中导出 Gltf 模型动画
- php - 在 codeigniter 中验证 url 中的 id 和 title
- security - Vaxin Security 和 Joomla 的集成?
- wordpress - 如何使用用户注册创建 WordPress 博客?