一、思考方式
故事是这样的,昨天领导遇到了一个很奇怪的bug,正常使用spring boot项目,通过Jpa默认方法链接数据库时,在dao层不能找到entity类:
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mapService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.boor.enp.dao.AddressCoordinatesDao com.boor.service.impl.fdlss.common.MapServiceImpl.addressCoordinatesDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'addressCoordinatesDao': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.boor.enp.domain.AddressCoordinates
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766)
at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
at org.springframework.boot.test.SpringApplicationContextLoader.loadContext(SpringApplicationContextLoader.java:98)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
... 24 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.boor.enp.dao.AddressCoordinatesDao com.boor.service.impl.fdlss.common.MapServiceImpl.addressCoordinatesDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'addressCoordinatesDao': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.boor.enp.domain.AddressCoordinates
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 40 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'addressCoordinatesDao': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class com.boor.enp.domain.AddressCoordinates
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
... 42 more
Caused by: java.lang.IllegalArgumentException: Not an managed type: class com.boor.enp.domain.AddressCoordinates
at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:219)
at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68)
at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:67)
at
1. 思考过程:
首先遇到这个问题我也是懵的,有效时间内并没有解决出来,只好从svn导出,慢慢解决;报错信息是 Failed to load ApplicationContext,Not an managed type: class com.boor.enp.domain.AddressCoordinates,dao层没有找到entity,仔细看了确认并不是的代码的问题,是项目配置问题。
在查了多个问题的解决方案后,在Application中添加了 @EntityScan(basePackages ={ “com.boor.enp.domain”,“com.boor.fdlss.domain”}),最终使项目能正常扫描到实体类。
这样解决最终出现了其他的问题,就是数据库找不到表的问题,确认是数据库的配置除了问题。
问题解决:
重点::
- 上个问题在以前的代码中并没有加@EntityScan,在以前的配置中也没有这个配置,所以这种解决方式是在补漏洞,并不是从根上去解决问题,思考这个问题的解决,也就是定位问题并不深入。
- 多总结,多反思,并不是一句空话,每天遇到的问题,大概十个以上,有些是简单的问题,查一查就解决了,有些是难点的问题,需要查很久才能解决,多想想,多总结,反思下次怎么才能更少的时间解决问题,才能在下次遇到问题时快速的定位并解决。
- 在解决问题的时候,你会遇到一些模糊的知识点,一些只会用但不懂的新技术,对于这些,才是自己进步的地方。