我正在尝试使用spring-data-jpa
为存储库中的方法实现自定义行为。
ProductRepository
接口是
@Repository
public interface ProductRepository extends JpaRepository,
ProductRepositoryCustom {
public List findByProductName(String productName);
}
ProductRepositoryCustom
界面包含saveCustom
我想要实现自定义行为。
@Repository
public interface ProductRepositoryCustom {
public Product saveCustom(Product product);
}
这是ProductRepositoryCustom
接口的实现。
这里的方法saveCustom
只是一个例子。我真正想要做的是定义一个自定义方法,使其包含一系列涉及核心JpaRepository
方法的指令。为此,我尝试注入ProductRepository
个实例但是我遇到了错误,如下所示。
public class ProductRepositoryCustomImpl implements ProductRepositoryCustom {
@Inject
private ProductRepository repo;
@Override
public Product saveCustom(Product product) {
// other executions of methods in ProductRepository(repo)
return repo.save(product);
}
}
这是我运行的简单ServerApp
应用程序。
public class ServerApp {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(
AppContext.class);
ProductRepository repo = context.getBean(ProductRepository.class);
Product testProduct = new Product();
testProduct.setProductName("Test Product");
repo.saveCustom(testProduct);
}
}
当我启动ServerApp
时,这是程序的堆栈跟踪。
Exception in thread "main" org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'productRepositoryCustomImpl': Bean with name 'productRepositoryCustomImpl' has been injected into other beans [productRepository] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:551)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.(AnnotationConfigApplicationContext.java:73)
at devopsdistilled.operp.server.ServerApp.main(ServerApp.java:16)
如何实施saveCustom
等自定义行为?
答案 0 :(得分:11)
您的课程有两个问题:
从此声明中删除@Repository注释:
@Repository
public interface ProductRepositoryCustom {
这将解决您当前的问题,但会出现another one。
解决方法是重命名
ProductRepositoryCustomImpl
到
ProductRepositoryImpl