[英]Spring Boot: How to declare a custom repository factory bean
我在应用程序上使用Spring Boot (1.3.3)和基于注释的/JavaConfig 配置。 我有以下存储库界面:
@RepositoryRestResource(collectionResourceRel = "something", path = "something")
public interface SomethingRepository
extends CrudRepository<SomethingRepository, Long> {
}
我想做的是覆盖生成的存储库代理中某些方法的行为。 我发现这样做的唯一方法是基于文档对添加新自定义方法的建议(请参阅: 向单个存储库添加自定义行为),因此我定义了以下接口:
public interface SomethingRepositoryCustom {
Something findOne(Long id);
}
...我添加了相应的实现:
public SomethingRepositoryImpl extends SimpleJpaRepository<Something, Long>
implements SomethingRepositoryCustom {
public SomethingRepositoryImpl(<Something> domainClass, EntityManager em) {
super(domainClass, em);
this.entityManager = em;
}
@Override
public Something findOne(Long id) {
System.out.println("custom find one");
// do whatever I want and then fetch the object
return null;
}
}
现在,如果我启动应用程序,我会收到以下错误:
... org.springframework.beans.BeanInstantiationException:无法实例化 [com.dummy.repositories.SomethingRepositoryImpl]:未找到默认构造函数; 嵌套异常是 java.lang.NoSuchMethodException: com.dummy.repositories.SomethingRepositoryImpl.() ...
问题:如何解决BeanInstantiationException? 我假设我需要声明一个存储库工厂 bean,但我不确定如何覆盖 Spring Boot 配置。
实际上,您必须在@EnableJpaRepositories
注释中声明一个新的 FactoryBean:
@Configuration
@EnableJpaRepositories(value = "your_package",
repositoryFactoryBeanClass = CustomFactoryBean.class)
public class ConfigurationClass{}
自定义工厂Bean.java:
public class CustomFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable> extends JpaRepositoryFactoryBean<R, T, I>{
@Override
protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
return new SimpleJpaExecutorFactory(entityManager);
}
/**
* Simple jpa executor factory
* @param <T>
* @param <I>
*/
private static class SimpleJpaExecutorFactory<T, I extends Serializable> extends JpaRepositoryFactory{
private EntityManager entityManager;
/**
* Simple jpa executor factory constructor
* @param entityManager entity manager
*/
public SimpleJpaExecutorFactory(EntityManager entityManager) {
super(entityManager);
this.entityManager = entityManager;
}
@Override
protected Object getTargetRepository(RepositoryMetadata metadata) {
JpaEntityInformation entityInformation =
getEntityInformation(metadata.getDomainType());
return new SomethingRepositoryImpl<T,I>(entityInformation, entityManager);
}
@Override
protected Class getRepositoryBaseClass(RepositoryMetadata metadata) {
return SomethingRepositoryImpl.class;
}
}
}
然后它将是您的SimpleJpaRepository
实例:将使用的SimpleJpaRepositoryImpl
从版本 1.9 开始,您不再需要创建新的 FactoryBean 类,而是可以直接设置基础存储库。 从贝尔东:
@Configuration
@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao",
repositoryBaseClass = ExtendedRepositoryImpl.class)
public class StudentJPAH2Config {
// additional JPA Configuration
}
public class ExtendedRepositoryImpl<T, ID extends Serializable>
extends SimpleJpaRepository<T, ID> implements ExtendedRepository<T, ID> {
private EntityManager entityManager;
public ExtendedRepositoryImpl(JpaEntityInformation<T, ?>
entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
this.entityManager = entityManager;
}
// ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.