美文网首页程序员
调试Spring Boot项目启动失败报UnsatisfiedD

调试Spring Boot项目启动失败报UnsatisfiedD

作者: 李北北 | 来源:发表于2018-03-05 11:48 被阅读0次

    本文是对之前一篇文章的补充:
    Spring Boot项目启动失败报:ERROR o.s.boot.SpringApplication - Application startup failed

    根据多次经验,spring boot项目启动时候报出UnsatisfiedDependencyException异常以及伴有 BeanInstantiationException: Failed to instantiate [org.mybatis.spring.SqlSessionTemplate] 的原因,基本上是某个mapper.xml文件中存在错误,但是失败后报出的异常又往往没有指明错误报出的位置,这就给我们定位错误带来了麻烦。
    下面介绍一下今天解决项目启动失败时候得出的一种解决方式,前提是你的项目是使用配置类进行配置的。

    1、配置类源码,该处定义了SqlSessionTemplate的对象创建以及SqlSessionFactory的对象创建的配置:

        @Bean
        SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource,
                                            @Qualifier("slaverDataSource") DataSource slaverDataSource) {
            SqlSessionFactory factory = null;
            try {
                SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
                sessionFactoryBean.setDataSource(dynamicDataSource(masterDataSource, slaverDataSource));
    
                PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    
                org.springframework.core.io.Resource[] resources = resolver.getResources("classpath*:/*/mybatis/**/*.xml");
                List<org.springframework.core.io.Resource> filterResourceList = new ArrayList<org.springframework.core.io.Resource>();
                List<String> fileNameList = new ArrayList<String>();
                for (int i = 0; i < resources.length; i++) {
                    org.springframework.core.io.Resource resource = resources[i];
                    if (!fileNameList.contains(resource.getFilename())) {
                        filterResourceList.add(resource);
                        fileNameList.add(resource.getFilename());
                    }
                }
    
                org.springframework.core.io.Resource[] result = new org.springframework.core.io.Resource[filterResourceList.size()];
                sessionFactoryBean.setMapperLocations(filterResourceList.toArray(result));
    
                factory = (SqlSessionFactory) sessionFactoryBean.getObject();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return factory;
        }
    
        @Bean
        public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterDataSource") DataSource masterDataSource,
                                                     @Qualifier("slaverDataSource") DataSource slaverDataSource) {
            return new SqlSessionTemplate(this.sqlSessionFactory(masterDataSource, slaverDataSource));
        }
    

    2、在上述代码中factory = (SqlSessionFactory) sessionFactoryBean.getObject();处打断点,然后启动项目,运行到该处时候,F6执行,就会跳入异常catch打印处e.printStackTrace(); 继续F6执行,然后就打印出了我们所需要的异常信息了,如下:

    org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [E:\xxx\xxx\xxx\xxx-common\target\classes\base\mybatis\ShiroUserMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.yuedu.common.model.basics.BasicsMenu'.  Cause: java.lang.ClassNotFoundException: Cannot find class: com.xxx.xxx.model.basics.BasicsMenu
        at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:522)
        at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:381)
        at org.mybatis.spring.SqlSessionFactoryBean.getObject(SqlSessionFactoryBean.java:546)
        at com.xxx.xxx.config.SpringBootServiceConfig.sqlSessionFactory(SpringBootServiceConfig.java:326)
        at com.xxx.xxx.config.SpringBootServiceConfig$$EnhancerBySpringCGLIB$$936c1517.CGLIB$sqlSessionFactory$2(<generated>)
        at com.xxx.xxx.config.SpringBootServiceConfig$$EnhancerBySpringCGLIB$$936c1517$$FastClassBySpringCGLIB$$81c66a7c.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
        at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356)
        at com.xxx.xxx.config.SpringBootServiceConfig$$EnhancerBySpringCGLIB$$936c1517.sqlSessionFactory(<generated>)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:207)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1214)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1292)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1199)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:207)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1214)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566)
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:349)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:207)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1214)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566)
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:349)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)
        at com.xxx.xxx.start.Application.main(Application.java:54)
    

    从上面异常信息中的第一行,就可以很明确看到问题出现在哪里了。

    注:也可以尝试在控制台打印的日志中查询 Failed to parse mapping resource 看看能不能找到该处错误。

    相关文章

      网友评论

        本文标题:调试Spring Boot项目启动失败报UnsatisfiedD

        本文链接:https://www.haomeiwen.com/subject/ayacfftx.html