I have this method and want to get rid of subscribe() (in line 5) and use map() or flatMap() instead (because it's not good to use subscribe() in a non-blocking scope):
private Mono<HttpStatus> transferToGlobalLibrary(UnpublishedArticle unpublishedArticle) {
return updateArticleService.updateArticle(unpublishedToOutputContentAdapter.adaptUnpublishedArticle(unpublishedArticle))
.map(httpStatusUpdateArticle -> {
if (httpStatusUpdateArticle.is2xxSuccessful())
articleRepository.save(unpublishedArticle).subscribe();
return httpStatusUpdateArticle;
});
}
I tried the following:
return updateArticleService.updateArticle(unpublishedToOutputContentAdapter.adaptUnpublishedArticle(unpublishedArticle))
.map(httpStatusUpdateArticle -> {
if (httpStatusUpdateArticle.is2xxSuccessful())
return articleRepository.save(unpublishedArticle)
.flatMap(savedArticle -> httpStatusUpdateArticle);
return httpStatusUpdateArticle;
});
which gives me the error no instance(s) of type variable(s) R exist so that HttpStatus conforms to Mono<? extends R>. Why is this error displayed?
What is the best way to refactor the code? Thanks!
Notes:
- updateArticle() performs a REST API call, httpStatusUpdateArticle contains the resulting HttpStatus
CodePudding user response:
map
is a method that returns a Mono
.
When you return httpStatusUpdateArticle
it's a Mono< HttpStatus>
.
flatMap
also returns a Mono
. So when you return flatMap
inside map
, then map
returns a Mono<Mono<HttpStatus>>
.
One solution is to not call map
in the first place:
return updateArticleService.updateArticle(unpublishedToOutputContentAdapter.adaptUnpublishedArticle(unpublishedArticle))
.flatMap(httpStatusUpdateArticle -> {
if (httpStatusUpdateArticle.is2xxSuccessful())
return articleRepository.save(unpublishedArticle)
.map(savedArticle -> httpStatusUpdateArticle);
return Mono.just(httpStatusUpdateArticle);
});