使用 Java 配置配置 Spring 数据 JPA 自定义存储库实现
Configure Spring Data JPA custom repository impl using Java Config
我正在使用 Spring 引导和 Spring 数据 JPA。我想创建一个自定义存储库方法,如参考资料中所述。我需要在自定义方法中引用 EntityManager。当 CustomRepositoryImpl class 有一个 @Autowired/@Inject 字段时,它工作正常。我想做的是使用 JavaConfig 配置这个 bean。这可能吗?到目前为止,我的尝试都失败了,这是我的代码:
public interface CustomerRepositoryCustom {
void resetAll();
}
public class CustomerRepositoryImpl implements CustomerRepositoryCustom {
// @Inject
private EntityManager em;
public CustomerRepositoryImpl(EntityManager em) {
this.em = em;
}
@Transactional
@Override
public void resetAll() {
// some code
}
}
在我的@SpringBootApplication class 中,根据定义,它是一个@Configuration class,我有一个像这样的@Bean 定义:
@Bean
public CustomerRepositoryCustom customerRepositoryCustom(EntityManager em) {
return new CustomerRepositoryImpl(em);
}
这行不通,这个方法被完全忽略了,我得到以下异常:
Caused by: java.lang.NoSuchMethodException: test.CustomerRepositoryImpl.<init>()
即Spring Data 不查看 @Bean 定义,它只是尝试使用不存在的默认构造函数创建自定义 repo bean 本身。
是否可以指示Spring数据使用@Bean方法?
你试过了吗?
@Repository
class MyCustomerRepo implements CrudRepository<User,Long>, CustomerRepositoryCustom{
}
class CustomerRepositoryCustomImpl implements CustomerRepositoryCustom{
private EntityManager em;
@Inject
public CustomerRepositoryImpl(EntityManager em) {
this.em = em;
}
@Transactional
@Override
public void resetAll() {
// some code
}
}
同时删除您的@bean 定义
编辑:
@autowired
EntityManager em;
@Bean
public CustomerRepositoryCustom customerRepositoryCustom() {
return new CustomerRepositoryImpl(em);
}
我认为问题是 bean 的名称,它应该被命名为 customerRepositoryImpl
而在 JavaConfig 的情况下它不是,如果您将 javaconfig 更改为此,它应该可以工作:
@Bean
public CustomerRepositoryCustom customerRepositoryImpl(EntityManager em) {
return new CustomerRepositoryImpl(em);
}
我正在使用 Spring 引导和 Spring 数据 JPA。我想创建一个自定义存储库方法,如参考资料中所述。我需要在自定义方法中引用 EntityManager。当 CustomRepositoryImpl class 有一个 @Autowired/@Inject 字段时,它工作正常。我想做的是使用 JavaConfig 配置这个 bean。这可能吗?到目前为止,我的尝试都失败了,这是我的代码:
public interface CustomerRepositoryCustom {
void resetAll();
}
public class CustomerRepositoryImpl implements CustomerRepositoryCustom {
// @Inject
private EntityManager em;
public CustomerRepositoryImpl(EntityManager em) {
this.em = em;
}
@Transactional
@Override
public void resetAll() {
// some code
}
}
在我的@SpringBootApplication class 中,根据定义,它是一个@Configuration class,我有一个像这样的@Bean 定义:
@Bean
public CustomerRepositoryCustom customerRepositoryCustom(EntityManager em) {
return new CustomerRepositoryImpl(em);
}
这行不通,这个方法被完全忽略了,我得到以下异常:
Caused by: java.lang.NoSuchMethodException: test.CustomerRepositoryImpl.<init>()
即Spring Data 不查看 @Bean 定义,它只是尝试使用不存在的默认构造函数创建自定义 repo bean 本身。
是否可以指示Spring数据使用@Bean方法?
你试过了吗?
@Repository
class MyCustomerRepo implements CrudRepository<User,Long>, CustomerRepositoryCustom{
}
class CustomerRepositoryCustomImpl implements CustomerRepositoryCustom{
private EntityManager em;
@Inject
public CustomerRepositoryImpl(EntityManager em) {
this.em = em;
}
@Transactional
@Override
public void resetAll() {
// some code
}
}
同时删除您的@bean 定义
编辑:
@autowired
EntityManager em;
@Bean
public CustomerRepositoryCustom customerRepositoryCustom() {
return new CustomerRepositoryImpl(em);
}
我认为问题是 bean 的名称,它应该被命名为 customerRepositoryImpl
而在 JavaConfig 的情况下它不是,如果您将 javaconfig 更改为此,它应该可以工作:
@Bean
public CustomerRepositoryCustom customerRepositoryImpl(EntityManager em) {
return new CustomerRepositoryImpl(em);
}