千家信息网

spring boot2内嵌Tomcat抛出异常怎么解决

发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,这篇文章主要讲解了"spring boot2内嵌Tomcat抛出异常怎么解决",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"spring boot2内嵌
千家信息网最后更新 2025年02月07日spring boot2内嵌Tomcat抛出异常怎么解决

这篇文章主要讲解了"spring boot2内嵌Tomcat抛出异常怎么解决",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"spring boot2内嵌Tomcat抛出异常怎么解决"吧!

我在使用springboot时,当代码有问题时,发现控制台打印下面信息:

Connected to the target VM, address: '127.0.0.1:42091', transport: 'socket'log4j:WARN No appenders could be found for logger (org.springframework.boot.devtools.settings.DevToolsSettings).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.  .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  '  |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot ::        (v2.0.6.RELEASE)2018-10-25 10:10:21.425  INFO 102158 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]2018-10-25 10:10:21.427  INFO 102158 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.342018-10-25 10:10:21.444  INFO 102158 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib]2018-10-25 10:10:21.590  INFO 102158 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext2018-10-25 10:10:24.522  INFO 102158 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]Disconnected from the target VM, address: '127.0.0.1:42091', transport: 'socket'Process finished with exit code 0

WTF?没有错误信息怎么解决问题? 各种搜索,总之就是代码有问题,自己检查把...

好吧,直接debug把

内嵌tomcat的入口类是org.apache.catalina.core.StandardService

//TODO 后面补上过程

最终找到org.springframework.context.support.AbstractApplicationContext 定位方法refresh()

if (logger.isWarnEnabled()) {                                logger.warn("Exception encountered during context initialization - " +                                                "cancelling refresh attempt: " + ex);                        }

debug可以正常进入,然后就看到我们希望看到的 ex了

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fabricApiController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fabricTemplate': Injection of resource dependencies failed; nested exception is org.springframework.boot.context.properties.ConfigurationPropertiesBindException: Error creating bean with name 'fabricConfiguration': Could not bind properties to 'FabricConfiguration' : prefix=blockchain, ignoreInvalidFields=false, ignoreUnknownFields=true; nested exception is org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'blockchain.channel-peers' to java.util.List

问题发现了,解决自己代码问题,然后重新启动,正常! 万事大吉?错,这才开始

上面我们简单解决了问题,但是根源没有解决!要说解决方案把当前流行的日志体系简单说一遍下面整理的来源网络:常见的日志框架,注意不是具体解决方案1 Commons-logging: apache 最早提供的日志的门面接口。避免和具体的日志方案直接耦合。类似于JDBC的api接口,具体的的JDBC driver实现由各数据库提供商实现。通过统一接口解耦,不过其内部也实现了一些简单日志方案2 Slf4j: 全称为Simple Logging Facade for JAVA:java简单日志门面。是对不同日志框架提供的一个门面封装。可以在部署的时候不修改任何配置即可接入一种日志实现方案。和commons-loging应该有一样的初衷。常见的日志实现:log4jlogbackjdk-logging详细优缺点不是本文重点,请自行搜索。

接着分析上面的问题,Commons-logging 是tomcat默认的日志系统(apache自家东西得支持),具体的日志实现,根据系统已存在日志系统选择。 简单列举以下log的实现: org.apache.commons.logging.Log | org.apache.commons.logging.impl.SimpleLog org.apache.commons.logging.impl.NoOpLog org.apache.commons.logging.impl.Log4JLogger org.apache.commons.logging.impl.SLF4JLog org.apache.commons.logging.impl.Jdk14Logger

springboot 默认使用的是logback日志实现,问题就出现在这里了!!!common-logs并没有logback的实现!

根据maven依赖,我们看到log4j和logback的包都被引入了,然后tomcat之能选择的是log4j,springboot使用的是logback。 log4j和logback只见缺少一个桥梁,正是缺少的这个桥梁,导致springboot只能输出logback!!!

中间的桥梁就是下面这个依赖

            org.slf4j        jcl-over-slf4j    

这个依赖可以将log4j输出到slf4j,从而从sl4j输出。

总结: 总结一下,已经搞明白是slf4j/common-logs <> log4j和logback的恩怨情仇

第一种解决方式:根据日志定位问题,然后采用加法处理,增加jcl-over-slf4j,打通slf4j和common-logs通道

第二种解决方式:解决冲突,一山不容二虎,排除掉slf4j,common-logs任意一方,spring使用slf4j,那可以排除调common-logs

感谢各位的阅读,以上就是"spring boot2内嵌Tomcat抛出异常怎么解决"的内容了,经过本文的学习后,相信大家对spring boot2内嵌Tomcat抛出异常怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

日志 问题 方案 代码 就是 接口 桥梁 系统 门面 学习 输出 信息 内容 常见 方式 框架 解决方案 定位 搜索 选择 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 杭州信息化网络技术包括什么 京东商品数据库表结构图 软件开发员擅自离职告知函 数据库设计两个表字段关联 万德数据库和洞见研报 安卓手机数据库用什么软件 手机学设计的软件开发 景安服务器托管 软件开发还是会计专业好 数据库软考中级真题百度网盘 武汉磐石市app软件开发 电商购物软件开发多少钱 上海云海服务器管理 软件开发行业注意事项 网络技术人员需要具备哪些能力 劳动局软件开发 淄博染色软件开发价格 长沙智能软件开发服务费 大陆可以访问服务器在外国的网站 us接口可以使用串口服务器吗 济南商中网络技术有限责任公司 软件开发建立产能基线建议 网络安全建设的背景 云服务器搭建人工智能项目 网络安全靠人民 主题团活 张店mrp软件开发服务 幻塔荒邻镇服务器找不到 网络安全概念板块为何持续下跌 佛山网络存储服务器 创巨网络技术服务有限公司
0