我有如下定义的通用基础存储库:
@NoRepositoryBean
public interface IBaseRepository<Template extends BaseModel, Id > extends
ElasticsearchRepository<Template,Id>, ICustomRepository{
}
我的 ICustomRepository 存储库接口定义如下:
@Repository
public interface ICustomRepository {
void someCustomFunction();
}
public class CustomRepositoryImpl implements ICustomRepository{
@Override
void someCustomFunction(){
}
}
现在当我使用 baserepository 时:
@Repository
public interface OrderRepository extends BaseRepository<OrderModel,Long>{
}
当我在我的服务类中自动连接 OrdeRepository 时,它给了我编译错误:
<块引用>引起:org.springframework.beans.factory.BeanCreationException: 创建名为“OrderRepository”的 bean 时出错 abc.example.OrderRepository 中定义 在 ElkApplication 上声明的 @EnableElasticsearchRepositories: init 方法调用失败;嵌套异常是 org.springframework.data.mapping.PropertyReferenceException:否 为 OrderModel 类型找到属性 someCustomFunction!
有人可以建议这里出了什么问题以及如何解决这个问题吗?
答案 0 :(得分:2)
将评论转换为回答
ICustomRepo
@Repository
public interface ICustomRepository {
void someCustomFunction();
}
IBaseRepository
@NoRepositoryBean
public interface IBaseRepository<Template extends BaseModel, Id > extends
ElasticsearchRepository<Template,Id>, ICustomRepository{
}
订单库
@Repository
public interface OrderRepository extends IBaseRepository<OrderModel,Long>{
}
OrderRepository 是一个存储库接口,一个 bean 是由 spring bean 处理器创建的,但是这个 OrderRepository
没有实现 someCustomFunction
,甚至 spring 也不知道它的实现,除非它知道它已经被实现了CustomRepositoryImpl
所以在 bootstrap/startup spring 会抛出一个错误。
因此,我们需要在 someCustomFunction
中实现它,而不是仅仅拥有 ICustomRepository
的定义,感谢 Java 8,我们也可以在接口中实现该方法
@Repository
public interface ICustomRepository {
default void someCustomFunction() {
// some code here
}
}
此代码将正常工作,JDK 和其他代理也将在此方法上工作,我们也可以在 someCustomFunction
上应用 AOP。
也可以在同样使用 default
和 @Override
的任何存储库中覆盖此方法。
@Repository
public interface OrderRepository extends IBaseRepository<OrderModel,Long>{
@Override
default void someCustomFunction() {
// some code here
}
}