无法构建 `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>-->
这解决了问题!
目标:从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>-->
这解决了问题!