未找到自定义基础存储库功能

时间:2021-03-19 08:51:37

标签: spring spring-boot spring-data

我有如下定义的通用基础存储库:

@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!

有人可以建议这里出了什么问题以及如何解决这个问题吗?

1 个答案:

答案 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
   }
}