其他的后面再写,先写重点。
做到这一步说明至少r2dbc应该是接过了,如果看的网上大部分教程,那么dao层大概率继承的是ReactiveCrudRepository吧,这么做的话再接redis或者mongo必报错,因为r2bc和mongodb-reactive都实现了ReactiveCrudRepository,所以spring不知道该注入哪个。
上个dao代码吧,如果你是这么写的那接起来程序必然无法启动:
import com.df.dfclouddevice.entity.AAA;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import reactor.core.publisher.Mono;
public interface CCCRepository extends ReactiveCrudRepository<AAA, Long> {
Mono<AAA> findByName(String name);
}
解决方法:
1.自己重写一个Repository,在里面声明你要接哪个数据源、扫描哪些包下的类;
2.用各自的Repository,连数据库的dao不再继承ReactiveCrudRepository,而是继承R2dbcRepository,其实你点开看看R2dbcRepository最后还是继承的ReactiveCrudRepository。mongo的就用ReactiveMongoRepository,点到最后也是ReactiveCrudRepository。
改完如下:
import com.df.dfclouddevice.entity.AAA;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import reactor.core.publisher.Mono;
public interface CCCRepository extends R2dbcRepository<AAA, Long> {
Mono<AAA> findByName(String name);
}
spring官方回答是这样的,看11.3.2:
如果要用这个写法,那dao层的代码就不能写成Mono或者Flux的形式,因为用的是jpa。