无法构建 `reactor.core.publisher.Mono` Spring Cloud OpenFeign 和 Spring boot 2 的实例

Cannot construct instance of `reactor.core.publisher.Mono` Spring Cloud OpenFeign and Spring boot 2

目标:从Spring Boot 1.x (webMvc) 迁移到版本 2 (webFlux) 和 Spring Cloud Edgware SR2 到 FinchleyM8 (等待发布版本)。

问题:Feign -> OpenFeign。 OpenFeign 底层使用 RxJava,但使用 WebFlux - Reactor3。当前,当我使用 Mono 作为返回类型时,出现错误:

Caused by: org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class reactor.core.publisher.Mono]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of reactor.core.publisher.Mono (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

代码示例:

@FeignClient(name = "thirdpartyresource", url = "${third.party.resource.url}")
public interface ThirdPartyResource {

    @PostMapping(value = "/validate", consumes = APPLICATION_FORM_URLENCODED_VALUE)
    Mono<ValidationResultDto> validate(MultiValueMap multiValueMap); // WORKS BAD
    // Single<ValidationResultDto> validate(MultiValueMap multiValueMap); WORKS WELL
}

问题: 我是否需要创建自己的 Single 到 Mono 转换器,或者它是 spring-cloud-starter-openfeign 的一些问题并且都应该可以 OOTB?

你可以使用那些方法来适配:

对于单个 rxJavaSingle

Mono.from(RxReactiveStreams.toPublisher(rxJavaSingle))

对于可完成的 rxJavaCompletable Mono.from(RxReactiveStreams.toPublisher(rxJavaCompletable))

reactor.core.publisher.Mono 属于 spring-boot-starter-webflux jar。

mvn repository获取最新版本。

然后将其添加到您的 pom.xml

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <version>2.5.3</version>
</dependency>

同时从您的 pom.xml 中删除 spring-boot-starter-web,以防万一您有它。

<!--<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
</dependency>-->

这解决了问题!