【问题标题】:How to inject CrudRepository in Spring JPA?如何在 Spring JPA 中注入 CrudRepository?
【发布时间】:2014-05-16 20:28:59
【问题描述】:

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

结果:

引起:org.springframework.beans.factory.BeanCreationException: 创建名为“userService”的 bean 时出错:资源注入 依赖失败;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 为依赖找到了类型为 [UserRepo] 的合格 bean:预计在 至少 1 个有资格作为自动装配候选者的 bean 依赖。依赖注解: {@javax.annotation.Resource(shareable=true, mappedName=, description=, 名称=,类型=类 java.lang.Object,查找=, 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;
    }
}

结果:缺少 emf,这很奇怪,因为我已经有工作的 DAO 服务,我可以毫无问题地自动连接 EntityManagerEMF

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

【问题讨论】:

  • 你有 UserRepo 的实现吗?
  • 不,我想使用这个spring接口提供的默认查询映射。
  • 请发布您的 Spring 配置。您是否启用了存储库支持?
  • 不,我没有。虽然没有帮助,但请参阅上面的更新
  • 您应该将其命名为 entityManagerFactory 或将 entity-manager-factory-ref 更改为“emf”

标签: java spring spring-data-jpa


【解决方案1】:

您应该验证以下内容:

1) 用@Repository 注释UserRepo

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

<jpa:repositories base-package="your.repository.package"></jpa:repositories>

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

更新

看来你完成了我的前 3 步,而你现在领先一步。现在,请记住,在 Java Config 方法中,名称 DO 很重要。将emf() 更改为entityManagerFactory()(更“标准”),或将entity-manager-factory-ref 设置为emf。示例:

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

【讨论】:

  • 好的,我按照您的建议做了,请参阅上面的更新答案,因为仍然存在问题...
  • 我已经在那里发表了评论。将“emf”的名称更改为“entityManagerFactory”,或设置entity-manager-factory-ref=emf
  • 太好了,成功了!不知道spring对这里的@Bean方法命名很严格。
  • 方法名其实就是bean的名字,相当于xml的
  • 好的,非常感谢。只是补充一下:我不必为接口使用注释@Repository。一个简单的界面就足够了。
【解决方案2】:

UserRepo 不需要注释:

 @Repository

【讨论】:

  • @membersound 并且您正在正确扫描所有内容,对吗? 上下文:组件扫描
  • 是的,因为我写的同一个包中的其他类是正确连接的。
  • @membersound 你也有这个吗?
  • 不,我没有这个。所以我们领先一步。虽然现在没有找到 EMF...
  • @membersound 这听起来像是一个不同的问题。接受(或不接受)一个答案并开始一个新的我猜。好吧,例外说明了一切,Spring 找不到这样的 bean..
【解决方案3】:

这一定是您的 applicationContext 配置中的问题。这是我用来让它工作的那个:

<jpa:repositories
    base-package="package.containing.your.repositories"
    factory-class="org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean"
    transaction-manager-ref="transactionManager"
    entity-manager-factory-ref="entityManagerFactory" />

<bean
    id="transactionManager"
    class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory" />

<bean
    id="hibernateJpaVendorAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />

<bean
    id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:dataSource-ref="dataSource"
    p:persistenceUnitName="PU"
    p:jpaVendorAdapter-ref="hibernateJpaVendorAdapter"
    p:jpaProperties="classpath:hibernate.properties" />

<util:property-path id="sessionFactory" path="entityManagerFactory.sessionFactory" />

【讨论】:

    【解决方案4】:

    使用 XML 和注解配置 Spring Data JPA

    //This is the two way to configure spring data JPA
        @EnableJpaRepositories (basePackages= "Repository Bean is located in package", entityManagerFactoryRef= "Here is your configuration of EntityManagerFactoryBean")
    
        <jpa:repositories base-package= "Repository Bean where package"
        Entity-manager-factory-ref= "Here is your configured EntityManagerFactoryBean" ></jpa:repositories>
       // Sample code:
       @Configuration
       @EnableTransactionManagement
       @EnableJpaRepositories(basePackages="com.zxg.springdata", 
                      entityManagerFactoryRef="factoryBean")
      public class SpringDataConfig {
        @Bean
        public LocalContainerEntityManagerFactoryBean factoryBean (
          ComboPooledDataSource dataSource, JpaVendorAdapter jpaVendorAdapter
          ){
             LocalContainerEntityManagerFactoryBean factoryBean = new 
                    LocalContainerEntityManagerFactoryBean ();
             FactoryBean.setDataSource (dataSource);
             FactoryBean.setJpaVendorAdapter (jpaVendorAdapter);
             FactoryBean.setPackagesToScan ("com.zxg.springdata");
             Return factoryBean;
           }
        }
    

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 2016-08-16
      • 1970-01-01
      • 2012-12-04
      • 2018-05-12
      • 1970-01-01
      • 2011-01-26
      • 2019-12-17
      • 2018-08-15
      相关资源
      最近更新 更多