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
How to inject CrudRepository in Spring 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 EntityManager
and EMF
without 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 UserRepo
with @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 @Autowired
instead 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-ref
to emf
. Example:
看来你完成了我的前 3 步,现在你领先一步了。现在,请记住,在Java中配置方法名称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;
}
回答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;
}
}