Spring Webflux 功能数据库更新不起作用

Posted

技术标签:

【中文标题】Spring Webflux 功能数据库更新不起作用【英文标题】:Spring Webflux functional db update does not work 【发布时间】:2020-03-16 10:12:44 【问题描述】:

我正在使用带有响应式 mongodb 的 spring webflux (SpringBoot 2.1.9)。我的 build.gradle 的一部分在这里

    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
    implementation 'org.springframework.boot:spring-boot-starter-webflux'

对于我的 CRUD 操作,创建和删除作品。更新方法不会引发异常,但内容不会保存在数据库中。我做错了什么?

MyHandler.java

    public Mono<ServerResponse> update(ServerRequest request) 
        return request.bodyToMono(ListAndReview.class).
                flatMap( update -> 
                    return listAndReviewRepo.findById(update.id).flatMap( previous -> 
                        previous.name = update.name;
                        previous.description = update.description;
                        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(fromObject(listAndReviewRepo.save(previous)));
                    );
                
                ).
                switchIfEmpty(ServerResponse.notFound().build());
    

【问题讨论】:

您能否尝试在您的listAndReviewRepo 中使用@Transactional 注释您的findById 方法 添加@Transactional 没有解决问题。 【参考方案1】:

把代码改成

public Mono<ServerResponse> update(ServerRequest request) 
        return request.bodyToMono(ListAndReview.class).
                flatMap( update -> 
                    return listAndReviewRepo.findById(update.id).flatMap( previous -> 
                        previous.name = update.name;
                        previous.description = update.description;
                        return listAndReviewRepo.save(previous)
                            .map(saved -> ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(fromObject(saved));
                    );
                
                ).
                switchIfEmpty(ServerResponse.notFound().build());
    

【讨论】:

.map(saved -&gt; ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(fromObject(saved)) 中缺少一个右括号,但即使我添加了代码也无法编译。编译错误是codeerror: 不兼容的类型:Mono 无法转换为 Mono> ).switchIfEmpty(ServerResponse.notFound().build()); code

以上是关于Spring Webflux 功能数据库更新不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot WebFlux NettyServerCustomizer 不起作用

spring 5 webflux 功能端点请求中不存在访问控制源头

使用 spring webflux 替代 @Cacheable

使用 Spring boot + WebFlux 进行全局错误处理

Spring Boot (十四): 响应式编程以及 Spring Boot Webflux 快速入门

使用 Spring Boot WebFlux、Spring Data MongoDB Reactive 和 ReactiveMongoRepository 更新 1 个或多个特定字段 MongoDB