首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我收到一条消息:无法构造`reactor.core.publisher.Mono`实例

我收到一条消息:无法构造`reactor.core.publisher.Mono`实例
EN

Stack Overflow用户
提问于 2022-10-02 17:57:49
回答 1查看 199关注 0票数 0

我和R2DBC一起使用了泽西和网络流量。通过邮递员发送邮件后,我收到一条消息:“无法构造reactor.core.publisher.Mono实例”

这是我的JerseyConfiguration:

代码语言:javascript
复制
@Component
public class JerseyConfiguration
        extends ResourceConfig {
    public JerseyConfiguration() {
        register(ProductController.class, 1);
    }
}

这位是我的主计长

代码语言:javascript
复制
@Path("/v1")
@Controller
public class ProductController {

    @Autowired
    private ProductService productService;

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/product")
    public Mono<Product> createProduct(@RequestBody Mono<Product> productMono){
        return productMono.flatMap(this.productService::createProduct);
    }
}

这是我的服务:

代码语言:javascript
复制
@Service
public class ProductService {

    @Autowired
    private ProductRepository repository;

    public Mono<Product> createProduct(final Product product){
        return this.repository.save(product);
    }
}

这也是我的pom.xml

代码语言:javascript
复制
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-r2dbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>io.r2dbc</groupId>
            <artifactId>r2dbc-postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

现在,这是我的问题,我从邮递员那里得到一条消息:

代码语言:javascript
复制
Cannot construct instance of `reactor.core.publisher.Mono` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 1]

请告诉我如何解决那个问题。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-02 20:03:00

你不能把WebFlux和泽西混为一谈。你应该选择一个或另一个,而不是两者兼而有之。它们都提供了HTTP服务器引擎,但是:

  • 泽西是Servlet实现,它对不了解任何关于反应性流、Mono、Flux等方面的知识。
  • Webflux是基于反应性流和异步Netty服务器的Spring服务器引擎。

如果您查看Spring Boot参考文档,第3.5节: Web,您将看到泽西是可用的引擎之一,它与其他可能的引擎竞争,即Web和webflux(Web通量)。

因此,答案是:泽西与Webflux不兼容,您必须在和Spring注释之间进行选择,或者选择泽西和Jax_RS,而不使用Mono/Flux作为返回类型。

注1:您应该使用@RestController with对类进行注释,以便它理解方法返回是HTTP主体(详见参考文件最后一段第1.4.1节: )。

注2:如果您真的想使用jersey,但仍然需要使用来自您系统其他部分的Mono对象,您可以使用反应堆提供的转换函数之一来返回泽西可以使用的对象。例如,在Mono对象上,您将找到一个toFuture()方法。您也可以阻止(),但这可能很危险。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73928140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档