使用 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);
}