1、maven pom配置如下文件:
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
2、自定实现一个自己的域存储库:
package com.springdata.jpa01.repository;
import com.springdata.jpa01.entity.User;
public interface MyUserRepository extends MyBaseRepository<User, Long> {
public User findById(Long id);
}
package com.springdata.jpa01.repository;
import com.springdata.jpa01.entity.User;
public interface MyUserRepository extends MyBaseRepository<User, Long> {
public User findById(Long id);
}
自定义存储库的好处,个人认为在于可以自定义暴露想要的方法
报错:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘myUserRepository’: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.lang.Object com.springdata.jpa01.repository.MyBaseRepository.findById1(java.io.Serializable)! No property id1 found for type User! Did you mean ‘id’?
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean0(AbstractBeanFactory.java:320) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1251) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1251) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor0(AbstractBeanFactory.java:320) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1251) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171) [spring−beans−5.1.8.RELEASE.jar:5.1.8.RELEASE]atorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessorAutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
… 24 common frames omitted
Caused by: java.lang.IllegalArgumentException: Failed to create query for method public abstract java.lang.Object com.springdata.jpa01.repository.MyBaseRepository.findById1(java.io.Serializable)! No property id1 found for type User! Did you mean ‘id’?
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.(PartTreeJpaQuery.java:84) ~[spring-data-jpa-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategyCreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:106) [spring−data−jpa−2.1.9.RELEASE.jar:2.1.9.RELEASE]atorg.springframework.data.jpa.repository.query.JpaQueryLookupStrategyCreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:106) ~[spring-data-jpa-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategyCreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:106) [spring−data−jpa−2.1.9.RELEASE.jar:2.1.9.RELEASE]atorg.springframework.data.jpa.repository.query.JpaQueryLookupStrategyCreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:211) ~[spring-data-jpa-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategyAbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:79) [spring−data−jpa−2.1.9.RELEASE.jar:2.1.9.RELEASE]atorg.springframework.data.repository.core.support.RepositoryFactorySupportAbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:79) ~[spring-data-jpa-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupportAbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:79) [spring−data−jpa−2.1.9.RELEASE.jar:2.1.9.RELEASE]atorg.springframework.data.repository.core.support.RepositoryFactorySupportQueryExecutorMethodInterceptor.lookupQuery(RepositoryFactorySupport.java:566) ~[spring-data-commons-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupportQueryExecutorMethodInterceptor.lambdaQueryExecutorMethodInterceptor.lambdaQueryExecutorMethodInterceptor.lambdamapMethodsToQuery$1(RepositoryFactorySupport.java:559) ~[spring-data-commons-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at java.util.stream.ReferencePipeline$31.accept(ReferencePipeline.java:193) [na:1.8.0131]atjava.util.Iterator.forEachRemaining(Iterator.java:116) [na:1.8.0131]atjava.util.Collections1.accept(ReferencePipeline.java:193) ~[na:1.8.0_131]
at java.util.Iterator.forEachRemaining(Iterator.java:116) ~[na:1.8.0_131]
at java.util.Collections1.accept(ReferencePipeline.java:193) [na:1.8.0131]atjava.util.Iterator.forEachRemaining(Iterator.java:116) [na:1.8.0131]atjava.util.CollectionsUnmodifiableCollection1.forEachRemaining(Collections.java:1049) [na:1.8.0131]atjava.util.Spliterators1.forEachRemaining(Collections.java:1049) ~[na:1.8.0_131]
at java.util.Spliterators1.forEachRemaining(Collections.java:1049) [na:1.8.0131]atjava.util.SpliteratorsIteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[na:1.8.0_131]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_131]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_131]
at java.util.stream.ReduceOpsReduceOp.evaluateSequential(ReduceOps.java:708) [na:1.8.0131]atjava.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) [na:1.8.0131]atjava.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) [na:1.8.0131]atorg.springframework.data.repository.core.support.RepositoryFactorySupportReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_131]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_131]
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[na:1.8.0_131]
at org.springframework.data.repository.core.support.RepositoryFactorySupportReduceOp.evaluateSequential(ReduceOps.java:708) [na:1.8.0131]atjava.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) [na:1.8.0131]atjava.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) [na:1.8.0131]atorg.springframework.data.repository.core.support.RepositoryFactorySupportQueryExecutorMethodInterceptor.mapMethodsToQuery(RepositoryFactorySupport.java:561) ~[spring-data-commons-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupportQueryExecutorMethodInterceptor.lambdaQueryExecutorMethodInterceptor.lambdaQueryExecutorMethodInterceptor.lambdanew0(RepositoryFactorySupport.java:551) [spring−data−commons−2.1.9.RELEASE.jar:2.1.9.RELEASE]atjava.util.Optional.map(Optional.java:215) [na:1.8.0131]atorg.springframework.data.repository.core.support.RepositoryFactorySupport0(RepositoryFactorySupport.java:551) ~[spring-data-commons-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at java.util.Optional.map(Optional.java:215) ~[na:1.8.0_131]
at org.springframework.data.repository.core.support.RepositoryFactorySupport0(RepositoryFactorySupport.java:551) [spring−data−commons−2.1.9.RELEASE.jar:2.1.9.RELEASE]atjava.util.Optional.map(Optional.java:215) [na:1.8.0131]atorg.springframework.data.repository.core.support.RepositoryFactorySupportQueryExecutorMethodInterceptor.(RepositoryFactorySupport.java:551) ~[spring-data-commons-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:324) ~[spring-data-commons-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:297) ~[spring-data-commons-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.util.Lazy.getNullable(Lazy.java:211) ~[spring-data-commons-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.util.Lazy.get(Lazy.java:94) ~[spring-data-commons-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:300) ~[spring-data-commons-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:121) ~[spring-data-jpa-2.1.9.RELEASE.jar:2.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
… 34 common frames omitted
错误原因在于之前的方法名定义错误,后来findById正确,个人感觉真正的原因为SpringData Jpa底层利用动态代理的方法实现的,我动态代理比如jdk原生支持的目标类(SimpleJpaRepository)和代理类实现同一个接口,如果我们方法名定义错误将无法与目标类进行匹配,这是一个约定的规则,所以会包上面错误。