Nic*_*las 1 java spring spring-data spring-boot
我在应用程序上使用Spring Boot(1.3.3)和基于注释的/ JavaConfig配置.我有以下存储库接口:
@RepositoryRestResource(collectionResourceRel = "something", path = "something")
public interface SomethingRepository
extends CrudRepository<SomethingRepository, Long> {
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是覆盖生成的存储库代理中的某些方法的行为.我发现这样做是基于什么文档建议添加新的自定义方法的唯一方法(参见:添加自定义行为,单库),所以我定义如下界面:
public interface SomethingRepositoryCustom {
Something findOne(Long id);
}
Run Code Online (Sandbox Code Playgroud)
...并添加相应的实现:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我启动应用程序,我会收到以下错误:
... 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{}
Run Code Online (Sandbox Code Playgroud)
CustomFactoryBean.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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后它将是你的SimpleJpaRepository实例:SimpleJpaRepositoryImpl将被使用
| 归档时间: |
|
| 查看次数: |
7811 次 |
| 最近记录: |