在命令行中运行spring boot之后,出现以下错误:https://egkatzioura.com/2016/06/03/add-custom-functionality-to-a-spring-data-repository/
我的项目源代码在github上:https://github.com/b3nhysteria/exprole_spring
此问题正在申请中:
System.out.println("============"+customerService.getListTransactionByCustomer());
服务中的实现是
public String getListTransactionByCustomer (){
return customerRepository.getAllTransaction();
}
在为method添加了自定义的repo +实现后,即使只是为了返回消息而进行了更改,我仍然遇到问题。
如果有人有相同的建议,我会尝试的
顺便说一句,此脚本用于探索/学习。
答案 0 :(得分:2)
在CustomerRepository
中,您implement TransactionRepoCustom
public interface CustomerRepository extends JpaRepository<Customer, CustomerId>, TransactionRepoCustom {
// ...
}
因此,Spring尝试找到在TransactionRepoCustom
中声明的方法public String getAllTransaction()
的实现(但没有这样做)。
因此,要解决此问题,您需要:
getAllTransaction
;也许创建另一个类TransactionRepoCustomImpl
(推荐!),或者getAllTransaction
的默认实现(如果使用Java 8)。按照第一种方法,它将类似于:
public class TransactionRepoCustomImpl implements TransactionRepoCustom {
@Override
public String getAllTransaction() {
return "logic for your custom implementation here";
}
}
遵循最后一种方法:
public interface TransactionRepoCustom {
public default String getAllTransaction() {
return "Not implemented yet!"; // of course, this is just a naive implementation to state my point
}
}
我已经创建了pull request,因此您可以在代码中尝试使用。
其他说明:
发生这种情况是因为Spring使用CustomerRepository
接口提供的implements
幕后默认(方法)实现。例如,Jparepository
接口就是这种情况:您可以使用customerRepository.findAll()
,并且没有在CustomerRepository
中声明(也未实现)该方法(该方法取自Jparepository
的实现,很可能包装在一个依赖项中。
现在,当您创建自己的接口(TransactionRepoCustom
并由CustomerRepository
实现时,Spring会尝试找到TransactionRepoCustom
中声明的所有方法的实现。由于您未提供任何内容,因此spring无法为您创建该bean。
在这种情况下,通过我提供的修复程序,Spring会找到该方法的实现,因此它可以为您创建bean。
最后,我说推荐的方法是为该方法提供一个实现,因为在Spring中做事情的方法是在接口中声明方法,并在其他类中提供其实现(该接口的默认实现)。在这种情况下,您可以为此创建一个单独的类,或在getAllTransaction
中实现CustomerRepository
方法。
只有一个方法(可争论)时,可以在同一接口中声明一个default
实现,但是如果接口变大,则可能难以维护。