使用Java Config配置Spring Data JPA自定义存储库impl

时间:2015-07-09 18:47:21

标签: java spring-boot spring-data

我正在使用Spring Boot和Spring Data JPA。我想创建一个自定义存储库方法,如参考资料中所述。我需要在自定义方法中引用EntityManager。当CustomRepositoryImpl类具有@Autowired / @Inject字段时,它可以正常工作。我想要做的是使用JavaConfig配置此bean。这可能吗?到目前为止,我的尝试都失败了,这是我的代码:

Lightness

在我的@SpringBootApplication类中,根据定义是一个@Configuration类,我有一个像这样的@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
    }
}

这不起作用,此方法完全被忽略,我得到以下异常:

@Bean
public CustomerRepositoryCustom customerRepositoryCustom(EntityManager em) {
    return new CustomerRepositoryImpl(em);
}

即。 Spring Data没有查看@Bean定义,它只是尝试使用默认构造函数创建自定义repo bean本身,该构造函数不存在。

是否可以指示Spring Data使用@Bean方法?

2 个答案:

答案 0 :(得分:1)

我认为问题是bean的名称,它应该命名为customerRepositoryImpl,在JavaConfig的情况下,它不是,如果你将javaconfig更改为它,它应该工作:

@Bean
public CustomerRepositoryCustom customerRepositoryImpl(EntityManager em) {
    return new CustomerRepositoryImpl(em);
}

答案 1 :(得分:-1)

你试过吗?

@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);
}