为ReactiveCrudRepository创建公共共享接口出现Bean创建错误,该方案是否可行?
问题原因
这个共享Repository的方案完全可以实现,报错原因是Spring Data R2dbc默认会把所有继承ReactiveCrudRepository的接口都当成需要实例化的Repository Bean,你的sharedRepo<T>是泛型公共接口,没有绑定具体实体类,Spring在实例化它的时候会把泛型T解析为Object,自然找不到对应@Table修饰的持久化实体,就抛出了这个错误。
Error creating bean with name 'sharedRepo' ... Couldn't find persistentEntity for type class java.lang.Object!
解决方案
给你的sharedRepo接口添加@NoRepositoryBean注解即可解决:
import org.springframework.data.repository.NoRepositoryBean @NoRepositoryBean interface sharedRepo<T> : ReactiveCrudRepository<T, UUID>
这个注解的作用就是告知Spring Data:不要为这个接口创建Repository实例,它仅作为父接口供其他业务Repository继承。加完之后就不会再尝试实例化sharedRepo,报错会直接消失。
其他代码问题修正
- 扩展方法里的
save调用需要传入参数,原有写法存在语法问题,修正后示例:
fun <T> sharedRepo<T>.persist(item: T) = runCatching { save(item) }
- Service层调用时注意类型匹配:
AClassRepository绑定的实体是itemA,只能调用它的方法传入itemA类型的实例,BClassRepository同理,你现有代码里repositoryB.persist(someInstanceOfItemA)存在类型编译错误,需要修正参数类型。
内容的提问来源于stack exchange,提问作者B-mdawg
相关产品推荐
相关产品推荐

