Java 如何在 Spring JPA 中注入 CrudRepository?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22864261/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 18:30:28  来源:igfitidea点击:

How to inject CrudRepository in Spring JPA?

javaspringspring-data-jpa

提问by membersound

I'd like to make use of spring-data-jpa and CrudRepository<T, ID extends Serializable>. But I cannot get it autowired. (all other services in the same package are wired correctly):

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

Result:

结果:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [UserRepo] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(shareable=true, mappedName=, description=, name=, type=class java.lang.Object, lookup=, authenticationType=CONTAINER)}

引起:org.springframework.beans.factory.BeanCreationException:创建名为“userService”的bean时出错:资源依赖注入失败;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 未找到类型为 [UserRepo] 的合格 bean 依赖项:预期至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@javax.annotation.Resource(shareable=true, mappingName=, description=, name=, type=class java.lang.Object, lookup=, authenticationType=CONTAINER)}

What might be wrong here?

这里可能有什么问题?

From the docs I think it should work without writing an implementation:

从文档中我认为它应该可以在不编写实现的情况下工作:

In a typical Java application, you'd expect to write a class that implements CustomerRepository. But that's what makes Spring Data JPA so powerful: You don't have to write an implementation of the repository interface. Spring Data JPA creates an implementation on the fly when you run the application.

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



Updated SpringConfig:

更新 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;
    }
}

Result: emf is missing, which is strange as I already have working DAO serices where I can autowire EntityManagerand EMFwithout any problem.

结果: 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

采纳答案by Shay Elkayam

You should verify the following:

您应该验证以下内容:

1) Annotate the UserRepowith @Repository.

1)将注解UserRepo@Repository

2) Your spring beans xml file should have in it:

2) 您的 spring beans xml 文件中应该包含:

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

3) I'd recommend injecting this type of bean with @Autowiredinstead of @Resource

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

UPDATE

更新

it seems you did my first 3 steps and you're one step ahead now. Now, remember that in Java Config methods names DOmatter. Either change emf()to entityManagerFactory()(which is more "standard"), or set entity-manager-factory-refto emf. Example:

看来你完成了我的前 3 步,现在你领先一步了。现在,请记住,在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;
    }

回答by Eugene

Doesn't UserRepo needs to be annotated with :

UserRepo 不需要注释:

 @Repository

回答by sp00m

It must be an issue in your applicationContext configuration. Here is the one I used to made it work:

它一定是您的 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" />

回答by Zhang_Ucan

Configuring spring data JPA using XML and annotations

使用 XML 和注解配置 spring 数据 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;
       }
    }