Java Spring Autowire在泛型类中找不到R2DBC存储库的实现 @服务 公共抽象类基服务{ @自动连线 受保护的R库; 公开摘要(E实体); 公开摘要转换实体(D DTO); 公共流量findAll(){ 返回repository.findAll().map(this::convertto); } 公共Mono findById(字符串id){ 返回repository.findById(id).map(this::convertto); } 公共单声道创建(D DTO){ 返回repository.insert(convertToEntity(DTO)).map(this::converttoto); } 公共单声道更新(D DTO){ 返回repository.save(convertToEntity(DTO)).map(this::converttoto); } 公共单声道删除(D DTO){ 返回repository.delete(convertToEntity(DTO)); } }
我将上面的类作为一个抽象类,我的所有基本服务类都将从中继承Java Spring Autowire在泛型类中找不到R2DBC存储库的实现 @服务 公共抽象类基服务{ @自动连线 受保护的R库; 公开摘要(E实体); 公开摘要转换实体(D DTO); 公共流量findAll(){ 返回repository.findAll().map(this::convertto); } 公共Mono findById(字符串id){ 返回repository.findById(id).map(this::convertto); } 公共单声道创建(D DTO){ 返回repository.insert(convertToEntity(DTO)).map(this::converttoto); } 公共单声道更新(D DTO){ 返回repository.save(convertToEntity(DTO)).map(this::converttoto); } 公共单声道删除(D DTO){ 返回repository.delete(convertToEntity(DTO)); } },java,spring,spring-boot,spring-data-jpa,spring-data-r2dbc,Java,Spring,Spring Boot,Spring Data Jpa,Spring Data R2dbc,我将上面的类作为一个抽象类,我的所有基本服务类都将从中继承 @服务 公共类ClusterService扩展了BaseService{ @自动连线 模型映射器模型映射器; @凌驾 public ClusterDTO Convertto(ClusterEntity){ 返回modelMapper.map(entity,ClusterDTO.class); } @凌驾 公共群集实体转换为实体(群集到DTO){ 返回modelMapper.map(DTO,ClusterEntity.class); }
@服务
公共类ClusterService扩展了BaseService{
@自动连线
模型映射器模型映射器;
@凌驾
public ClusterDTO Convertto(ClusterEntity){
返回modelMapper.map(entity,ClusterDTO.class);
}
@凌驾
公共群集实体转换为实体(群集到DTO){
返回modelMapper.map(DTO,ClusterEntity.class);
}
}
这是我的服务课
@菜豆
公共接口IChanakyaR2dbcRepository扩展了ReactiveCrudepository{
/**
*插入给定实体。使用返回的实例进行进一步操作,因为保存操作可能已更改
*完整的实体实例。
*
*@param实体不能为{@literal null}。
*@return{@link Mono}发出插入的实体。
*@在给定的{@literal entity}为{@literal null}的情况下抛出IllegalArgumentException。
*/
Mono insert(S实体);
}
这是我的存储库类
@Slf4j
@事务(只读=真)
公共类ChanakyaR2dbcRepository扩展了SimpleR2dbcRepository{
私人最终关系实体信息实体;
专用最终数据库客户端数据库客户端;
专用最终R2DBC转换器转换器;
私有最终反应数据访问策略;
public ChanakyaR2dbcRepository(关系实体信息实体、数据库客户端数据库客户端、R2DBC转换器转换器、反应数据访问策略){
super(实体、数据库客户端、转换器、访问策略);
this.entity=实体;
this.databaseClient=databaseClient;
这个。转换器=转换器;
this.accessStrategy=accessStrategy;
}
@交易的
公共Mono插入(S对象保存){
Assert.notNull(objectToSave,“要插入的对象不能为null!”);
试一试{
返回此.databaseClient.insert()
.into(this.entity.getJavaType())
.table(this.entity.getTableName())。使用(objectToSave)
.map(此.converter.populatedifnecessary(objectToSave))
.first()
.defaultIfEmpty(objectToSave);
}捕获(DataIntegrityViolationException diex){
String errMsg=String.format(“数据库中已存在实体{}”,this.Entity);
日志错误(errMsg,diex);
返回Mono.error(新的非法状态异常(errMsg));
}
}
}
这是我的存储库实现
当我运行应用程序时,会出现以下错误
org.springframework.beans.factory.UnsatifiedPendencyException:创建名为“clusterService”的bean时出错:通过字段“repository”表示未满足的依赖关系;
嵌套异常是
org.springframework.beans.factory.noSuchBean定义异常:否
类型的限定bean
“com.appdynamics.sum.chanakya.repository.base.IChanakyaR2dbcRepository”可用:至少需要1个符合条件的bean
作为自动连线的候选者。依赖项批注:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}
上面的autowire不起作用,但是当我直接(而不是通过泛型类型)在另一个componenet中autowireIChanakyaR2dbcRepository
时。它很好用
做这种事的正确方法是什么?我想要BaseService实现
我知道,如果您创建一个扩展IChanakyaR2dbcRepository
的接口,并将该类作为泛型类型传递给BaseService
,那么它将正常工作。但这意味着为我拥有的每个实体创建这样的空类,这不是一个理想的解决方案 您应该尝试以下方法:
@EnableR2dbcRepositories(basePackages = {"your.repository.package"},
basePackageClasses = {})
问题在于springboot不知道在哪里可以找到这个自定义类型
r2dbc
repository您不需要为接口本身声明一个实现,除非您绝对想要自定义crud之外的东西