如何在Spring JPA中注入CrudRepository?

mem*_*und 16 java spring spring-data-jpa

我想使用spring-data-jpa和CrudRepository<T, ID extends Serializable>.但我不能让它自动装配.(同一个包中的所有其他服务都正确连接):

@Service
public class UserService {
    @Resource
    private UserRepo repo;

    //this does neither work
    //@Autowired
    //private CrudRepository<User, Long> repo;

}

public interface UserRepo extends CrudRepository<User, Long> {

}

@Entity
public class User {
    @Id
    private Long id;
} 
Run Code Online (Sandbox Code Playgroud)

结果:

引起:org.springframework.beans.factory.BeanCreationException:创建名为'userService'的bean时出错:资源依赖注入失败; 嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到[UserRepo]类型的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者.依赖注释:{@ javax.annotation.Resource(shareable = true,mappedName =,description =,name =,type = class java.lang.Object,lookup =,authenticationType = CONTAINER)}

这可能有什么问题?

从文档我认为它应该工作而不编写实现:

在典型的Java应用程序中,您希望编写一个实现CustomerRepository的类.但这就是使Spring Data JPA如此强大的原因:您不必编写存储库接口的实现.Spring Data JPA在您运行应用程序时动态创建实现.


更新了SpringConfig:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("my.package")
public class AppConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean emf() throws ClassNotFoundException, PropertyVetoException {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setDataSource(dataSource());
        emf.setPackagesToScan("my.package");
        emf.setJpaVendorAdapter(jpaAdapter());
        emf.setJpaProperties(jpaProterties());
        return emf;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:emf丢失了,这很奇怪,因为我已经有工作DAO服务,我可以自动装配EntityManager,EMF没有任何问题.

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1a6e658': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:336)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:632)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:442)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1094)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:989)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:276)
    ... 50 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:641)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1159)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:282)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
    ... 58 more
Run Code Online (Sandbox Code Playgroud)

Sha*_*yam 16

您应该验证以下内容:

1)注释UserRepowith @Repository.

2)你的spring bean xml文件应包含在其中:

<jpa:repositories base-package="your.repository.package"></jpa:repositories>
Run Code Online (Sandbox Code Playgroud)

3)我建议用@Autowired而不是注入这种类型的bean@Resource

UPDATE

看来你做了我的前三步,现在你已经领先一步了.现在,请记住,在Java中配置方法名称DO重要.要么emf()改为entityManagerFactory()(更"标准"),要么设置entity-manager-factory-refemf.例:

@Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws ClassNotFoundException, PropertyVetoException {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setDataSource(dataSource());
        emf.setPackagesToScan("my.package");
        emf.setJpaVendorAdapter(jpaAdapter());
        emf.setJpaProperties(jpaProterties());
        return emf;
    }
Run Code Online (Sandbox Code Playgroud)