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要走后台了,正因为对后台不了解,才能发这些简单的,但又让自己绕弯的内容。。但对于前端,见到的越多,理解的越深,越发现不知道的越多,不了解的越多。只能求知若渴,不敢提笔妄谈。希望有天有所认知,可以分享给大家。
SpringBoot 版本升级后报错 Cannot instantiate interface org.springframework.context.ApplicationContextInitializer的更多相关文章
- springboot 启动报错"No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available"
1.问题 springboot启动报错 "D:\Program Files\Java\jdk-11\bin\java.exe" -XX:TieredStopAtLevel=1 -n ...
- SpringCloud报错:Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
今天启动用eureka的服务消费者时,一直出现问题. SpringCloud报错: Caused by: org.springframework.context.ApplicationContextE ...
- Springboot启动后报错【This application has no explicit mapping for /error, so you are seeing this as a fallback····】
This application has no explicit mapping for /error, so you are seeing this as a fallback. Wed Dec 1 ...
- Activity 中的Toast在Activity销毁后报错,解决方法,把context改成应用的
ToastUtil.showShort(context, R.string.connection_fail); 改成 ToastUtil.showShort(BusinesslinkApplicati ...
- Android 加了自定义Application后报错 Unable to instantiate activity ComponentInfo ClassNotFoundException
在Android自定义一个类继承集成Application后,并在AndroidManifest.xml里面配置了application的name属性为该类名称后报错: Unable to insta ...
- springboot启动报错:Cannot determine embedded database driver class for database type NONE.
package cn.zb.test; import org.springframework.boot.SpringApplication; import org.springframework.bo ...
- zabbix安装unixODBC配置完之后报错
zabbix安装unixODBC配置完之后报错 libmysqlclient_16 not defined in file libmysqlclient_r.so.16 分析 我没有使用centos6 ...
- 我用VS2012在Nuget中安装Signalr之后报错
我用VS2012在Nuget中安装Signalr之后报错 “/”应用程序中的服务器错误. The following errors occurred while attempting to load ...
- 服务器的SVN项目版本较低,check out 下来后报错
check out下来后报错提示: svn: E155036: Please see the 'svn upgrade' commandsvn: E155036: Working copy '/hom ...
随机推荐
- PM2.5
http://baike.baidu.com/view/1423678.htm PM2.5是指大气中直径小于或等于2.5微米的颗粒物,也称为可入肺颗粒物.虽然PM2.5只是地球大气成分中含量很少的组分 ...
- HDMI原理图信号PIN脚
HDMI(19Pin)/DVI(16 pin)的功能是热插拔检测(HPD),这个信号将作为主机系统是否对HDMI/DVI是否发送TMDS信号的依据.HPD是从显示器输出送往计算机主机的一个检测信号.热 ...
- 16:Merge
题目描述 数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述:先输入键值对的个数,然后输入成对的index和value值 ...
- jquery垂直滚动插件一个参数用于设置速度,兼容ie6
利用外层的块级元素负外边距来滚动 1.使用 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://ww ...
- Chrome自带恐龙小游戏的源码研究(二)
在上一篇<Chrome自带恐龙小游戏的源码研究(一)>中实现了地面的绘制和运动,这一篇主要研究云朵的绘制. 云朵的绘制通过Cloud构造函数完成.Cloud实现代码如下: Cloud.co ...
- jQuery Validate(一)
jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单. 但是在学习的过程中,我也遇到了疑惑,网上的很多例子貌似都是依赖jquery.metadata.js这个库, ...
- Linux模块机制浅析_转
Linux模块机制浅析 转自:http://www.cnblogs.com/fanzhidongyzby/p/3730131.htmlLinux允许用户通过插入模块,实现干预内核的目的.一直以来,对l ...
- C# C/S程序使用HTML文件作为打印模板
C# C/S程序使用HTML文件作为打印模板 在网上找了一堆的资料,整理到郁闷呀,慢慢试慢慢改.哎,最终成功了,哈,菜鸟伤不起呀 public partial class Print : Form ...
- Unix环境高级编程---信号
参考博客:http://blog.csdn.net/alex_my/article/details/39494129 1. 信号概念 何为信号? 信号是一种软中断,可以由以下情形触发: -1: 用户按 ...
- 九度OJ 1008:最短路径问题 (最短路)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8064 解决:2685 题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费 ...