电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Spring Boot 項目啟動失敗的解決方案

瀏覽:12日期:2023-07-21 10:54:40

Spring Boot 項目是不是經(jīng)常失敗,顯示一大堆的錯誤信息,如端口重復綁定時會打印以下異常:

***************************APPLICATION FAILED TO START***************************Description:Embedded servlet container failed to start. Port 8080 was already in use.Action:Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port.

這個大家應該很熟悉了吧!

錯誤信息大家都能看懂,但很不友好,那么,Spring Boot 是怎么實現(xiàn)這樣一個異常錯誤信息輸出的呢?今天棧長分享一個 Spring Boot 啟動失敗的簡單易懂的玩法,讓新來的實習生 1 秒都能看出問題。

如果你對 Spring Boot 還不是很熟悉,或者只是會簡單的使用,那還是建議你深入學習下吧,推薦這個 Spring Boot 學習倉庫,歡迎 Star 關注:

https://github.com/javastacks/spring-boot-best-practice

Failure Analyzers 介紹

Spring Boot 中注冊了許多 'Failure Analyzers',即 '失敗分析器',Spring Boot 中的啟動失敗的場景都是由這些失敗分析器攔截處理的。

Spring Boot 提供了 FailureAnalyzers 接口:

package org.springframework.boot.diagnostics;/** * A {@code FailureAnalyzer} is used to analyze a failure and provide diagnostic * information that can be displayed to the user. * * @author Andy Wilkinson * @since 1.4.0 */@FunctionalInterfacepublic interface FailureAnalyzer { /** * Returns an analysis of the given {@code failure}, or {@code null} if no analysis * was possible. * @param failure the failure * @return the analysis or {@code null} */ FailureAnalysis analyze(Throwable failure);}

這個接口的目的就是: 分析啟動失敗異常并顯示給用戶有用的診斷信息。

Spring Boot 內置注冊的所有失敗分析器在這個文件里面:

/org/springframework/boot/spring-boot/2.3.5.RELEASE/spring-boot-2.3.5.RELEASE-sources.jar!/META-INF/spring.factories

注冊的所有失敗分析器列表:

# Failure Analyzersorg.springframework.boot.diagnostics.FailureAnalyzer=org.springframework.boot.context.properties.NotConstructorBoundInjectionFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.BeanCurrentlyInCreationFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.BeanDefinitionOverrideFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.BeanNotOfRequiredTypeFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.BindFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.BindValidationFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.UnboundConfigurationPropertyFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.ConnectorStartFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.NoSuchMethodFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.NoUniqueBeanDefinitionFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.PortInUseFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyNameFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyValueFailureAnalyzer

再回到上面的端口重復綁定啟動失敗異常,就是注冊了 PortInUseFailureAnalyzer 這個失敗分析器,可以看到 PortInUseFailureAnalyzer 失敗分析器就在注冊列表里面。

再來看下 PortInUseFailureAnalyzer 的源碼:

/** * A {@code FailureAnalyzer} that performs analysis of failures caused by a * {@code PortInUseException}. * * @author Andy Wilkinson */class PortInUseFailureAnalyzer extends AbstractFailureAnalyzer<PortInUseException> { @Override protected FailureAnalysis analyze(Throwable rootFailure, PortInUseException cause) { return new FailureAnalysis('Web server failed to start. Port ' + cause.getPort() + ' was already in use.', 'Identify and stop the process that’s listening on port ' + cause.getPort() + ' or configure this ' + 'application to listen on another port.', cause); }}

只要應用啟動過程上拋出了 PortInUseException 異常就會被這個失敗分析器攔截并輸出可讀性的錯誤信息,現(xiàn)在知道綁定重復綁定錯誤是怎么輸出的了。

自定義 Failure Analyzers

從內置的失敗分析器中可以發(fā)現(xiàn),所有的分析器都繼承了這個抽象基類是:AbstractFailureAnalyzer,它實現(xiàn)了 FailureAnalyzer 接口,一般基于這個抽象基類就可以實現(xiàn)自定義失敗分析器的擴展。

下面棧長通過兩個示例帶大家了解下,如何擴展或者自定義一個 FailureAnalyzer。

1、重寫端口失敗分析器

比如說上面的PortInUseFailureAnalyzer 輸出內容是英文的,不是很直觀的看出,我們可以自己實現(xiàn)一個中文的端口失敗分析器。

很簡單,創(chuàng)建一個失敗分析器繼承 AbstractFailureAnalyzer 抽象類即可:

package cn.javastack.springboot.features.analyzer;import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;import org.springframework.boot.diagnostics.FailureAnalysis;import org.springframework.boot.web.server.PortInUseException;public class PortInUseFailureAnalyzer extends AbstractFailureAnalyzer<PortInUseException> { @Override protected FailureAnalysis analyze(Throwable rootFailure, PortInUseException cause) { return new FailureAnalysis('你啟動的端口 ' + cause.getPort() + ' 被占用了.', '快檢查下端口 ' + cause.getPort() + ' 被哪個程序占用了,或者強制殺掉進程.', cause); }}

重寫 analyze 方法,并返回一個 FailureAnalysis 對象,F(xiàn)ailureAnalysis 類的三個主要信息分別是:

public FailureAnalysis(String description, String action, Throwable cause) { this.description = description; this.action = action; this.cause = cause;}

即要展示的:可讀性的錯誤描述、建議的檢查修復動作、原始異常。

然后在自己的資源目錄下創(chuàng)建 META-INF/spring.factories 文件,內容添加:

org.springframework.boot.diagnostics.FailureAnalyzer=cn.javastack.springboot.features.analyzer.PortInUseFailureAnalyzer

啟動輸出:

***************************APPLICATION FAILED TO START***************************Description:你啟動的端口 8080 被占用了.Action:快檢查下端口 8080 被哪個程序占用了,或者強制殺掉進程.

這樣重新實現(xiàn)一下是不是要清楚多了?實習生都能看懂!

2、自定義失敗分析器

下面再來自定義一個全新的失敗分析器,讓大家能更清楚的認識失敗分析器。

我們在創(chuàng)建 Bean 的過程中手動拋出一個自定義的異常:

@Beanpublic CommandLineRunner commandLineRunner(){ throw new JavastackException('Java技術棧異常');}

添加一個失敗分析器攔截該異常:

package cn.javastack.springboot.features.analyzer;import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;import org.springframework.boot.diagnostics.FailureAnalysis;public class JavastackFailureAnalyzer extends AbstractFailureAnalyzer<JavastackException> { @Override protected FailureAnalysis analyze(Throwable rootFailure, JavastackException cause) { return new FailureAnalysis('Java技術棧發(fā)生異常了……', '趕快去檢查一下吧!', cause); }}

添加注冊:

org.springframework.boot.diagnostics.FailureAnalyzer=cn.javastack.springboot.features.analyzer.PortInUseFailureAnalyzer,cn.javastack.springboot.features.analyzer.JavastackFailureAnalyzer

啟動輸出:

***************************APPLICATION FAILED TO START***************************Description:Java技術棧發(fā)生異常了……Action:趕快去檢查一下吧!

如果不注冊該失敗分析器,這個自定義的異常就不會被內置的失敗分析器攔截,就會輸出大堆的異常信息,使用失敗分析器能很直觀的看出是什么錯誤及怎么修復這個錯誤。

總結

Spring Boot 提供的失敗分析器以友好的錯誤信息和修復建議代替了大堆的錯誤異常信息,可以幫助我們更直觀的定位應用啟動故障,你學會了嗎?

本文的所有示例源代碼都已上傳到了 Github:

https://github.com/javastacks/spring-boot-best-practice

歡迎大家 Star 關注,后續(xù)會不斷更新。

以上就是Spring Boot 項目啟動失敗的解決方案的詳細內容,更多關于Spring Boot 項目啟動失敗的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 谈股票-今日股票行情走势分析-牛股推荐排行榜 | 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | YJLV22铝芯铠装电缆-MYPTJ矿用高压橡套电缆-天津市电缆总厂 | 熔体泵|换网器|熔体齿轮泵|熔体计量泵厂家-郑州巴特熔体泵有限公司 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 成都热收缩包装机_袖口式膜包机_高速塑封机价格_全自动封切机器_大型套膜机厂家 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 水轮机密封网 | 水轮机密封产品研发生产厂家 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 北京中航时代-耐电压击穿试验仪厂家-电压击穿试验机 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 冷柜风机-冰柜电机-罩极电机-外转子风机-EC直流电机厂家-杭州金久电器有限公司 | 悬浮拼装地板_幼儿园_篮球场_悬浮拼接地板-山东悬浮拼装地板厂家 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 实验室隔膜泵-无油防腐蚀隔膜泵-耐腐蚀隔膜真空泵-杭州景程仪器 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 | 浙江宝泉阀门有限公司 | 压砖机、液压制砖机、静压砖机、环保砖机生产厂家—杜甫机械 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 标准光源箱|对色灯箱|色差仪|光泽度仪|涂层测厚仪_HRC大品牌生产厂家 | 西安烟道厂家_排气道厂家_包立管厂家「陕西西安」推荐西安天宇烟道 | 手板-手板模型-手板厂-手板加工-生产厂家,[东莞创域模型] | 山东信蓝建设有限公司官网 | 旋振筛|圆形摇摆筛|直线振动筛|滚筒筛|压榨机|河南天众机械设备有限公司 | 双齿辊破碎机-大型狼牙破碎机视频-对辊破碎机价格/型号图片-金联机械设备生产厂家 | 管理会计网-PCMA初级管理会计,中级管理会计考试网站 | 减速机电机一体机_带电机减速器一套_德国BOSERL电动机与减速箱生产厂家 | 环氧树脂地坪_防静电地坪漆_环氧地坪漆涂料厂家-地壹涂料地坪漆 环球电气之家-中国专业电气电子产品行业服务网站! | 耙式干燥机_真空耙式干燥机厂家-无锡鹏茂化工装备有限公司 | 软文推广发布平台_新闻稿件自助发布_媒体邀约-澜媒宝 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 酒吧霸屏软件_酒吧霸屏系统,酒吧微上墙,夜场霸屏软件,酒吧点歌软件,酒吧互动游戏,酒吧大屏幕软件系统下载 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 双相钢_双相不锈钢_双相钢圆钢棒_双相不锈钢报价「海新双相钢」 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | 首页-浙江橙树网络技术有限公司|