zoukankan      html  css  js  c++  java
  • SpringBoot 版本升级后报错 Cannot instantiate interface org.springframework.context.ApplicationContextInitializer

      本篇博客纯粹讲我遇到这个问题的解决以及思考,如果你想知道解决方法,可以直接看正确解决方案部分。因为是前端写的,所以可能有些明显的内容很容易就看出来了。

      首先:升级后更新其他依赖,以及Application.yml的配置,去除旧的内容就不说了,比较简单。

      遇到这个问题,是因为 SpringBoot 升级 后导致的,程序不能运行,至于原因,则是因为我们 前端写后台代码,大部分是根据之前项目 配置,所以版本过低,而需要升级。

      写这篇文章是记录一下自己的思考,以及其中的周折,也帮助其他人快速找到问题的根源。也许会有人问,你们后台呢。他们没有这么升级过,给的建议是直接一步步导入到一个新的项目中。。而我觉得,问题既然产生,定然是有原因的,若没找到,导入也不一定好转,反而错过了踩坑的机会。

      错误内容:

        org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer

        Cannot instantiate interface org.springframework.context.ApplicationContextInitializer

      第二句已经写出来了,是springframework 上下文内容问题,启动时报错。第一句搜索基本不是相关问题,第二句得到一个答案:升级 springframework.version 为 2.0以上,但是仍然会报错。

      下面产生我的第一个思路:

        检查导入的依赖,果然发现有一个 org.springframework.boot 版本为 1.3.6, 果断更新,到官网查找后发现2.0.3版本,在项目引入,版本依然是1.3.6,因为 SpringBoot 2.0后移除了这个依赖。但由于 Application 启动,并不必须 SpringBootServletInitializer, 果断删除。 在.xml 中移除依赖。

        结果打包成功!但在tomcat访问产生404。。

      下面产生第二个思路:(这个思路其实是无理的,可以节省的)

        看到SpringBoot 官网文档说,2.0以后导出war包必须要有SpringBootServletInitializer,但在我加上后导入依赖仍然是1.3.6, 我就抱着侥幸的心里,导入了2.0.3版本的 org.springframework.boot ,侥幸的想着,可能运行不了,但打的包可以用,然后打完war包,再返回来去掉,运行代码。这哪里符合简洁的标准!!!接着跟着网上配置了一波 xml, 打了一系列包,在tomcat中都启动失败。

      下面产生第三个思路:

        我为何不新建一个SpringBoot 2.0的项目,测试打包是否可行!!想到就做,这里说以SpringBoot 项目新建完后需要导入spring-boot-starter-web,spring-boot-starter-tomcat两个依赖。然后引入 SpringBootServletInitializer ,发现并没有让我导入依赖。至此,发现差异。回头解决。其实完全不需要导入org.springframework.boot 依赖,而是直接导入org.springframework.boot.web.servlet.support.SpringBootServletInitializer;即可。

      接着clean,运行打包,放入tomcat。go ok!

      正确解决方案:

      首先继承 SpringBootServletInitializer , 但不要导入 org.springframework.boot 。 导入org.springframework.boot.web.servlet.support.SpringBootServletInitializer;即可。

    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    
    	@Override
    	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    		return application.sources(Application.class);
    	}
    
    	public static void main(String[] args) throws Exception {
    		SpringApplication.run(Application.class, args);
    	}
    
    }
    

      修改pom.xml, clean 项目,重新打包即可。

      

    <packaging>war</packaging>
    
    <dependencies>
    	<!-- … -->
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-tomcat</artifactId>
    		<scope>provided</scope>
    	</dependency>
    	<!-- … -->
    </dependencies>
    

      

      随感

      其实这个显然从到到尾并不是很难的问题,一切都要按照合理的思路思考,并且不烦躁,应该会解决的更快一些。可能因为马上要放高温假了,就想着赶快把一切处理好,多加备用方案。所以有些急了,急显然会让一些简单的东西从眼皮下面溜走。。

      哇,我是前端呀!!!不要觉得这个coder要走后台了,正因为对后台不了解,才能发这些简单的,但又让自己绕弯的内容。。但对于前端,见到的越多,理解的越深,越发现不知道的越多,不了解的越多。只能求知若渴,不敢提笔妄谈。希望有天有所认知,可以分享给大家。

      

  • 相关阅读:
    Python文件操作
    Python操作MySQL数据库
    Can't connect to MySQL server (10065)
    CentOS安装Navicat
    机器学习中Batch Size、Iteration和Epoch的概念
    Python禁用GC优化性能
    TensorFlow迭代速度变慢的问题
    Linear SVM和LR的区别和联系
    拉格朗日乘子法和KKT条件
    Python机器学习(1):KMeans聚类
  • 原文地址:https://www.cnblogs.com/zgh-blog/p/SpringBootUpdateError.html
Copyright © 2011-2022 走看看