启动Spring Boot 项目失败如何解决?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。spring Boot 项目是不是经常失败,显示一大堆的错误信息,如端口重复绑定时
启动Spring Boot 项目失败如何解决?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
spring Boot 项目是不是经常失败,显示一大堆的错误信息,如端口重复绑定时会打印以下异常:
***************************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 是怎么实现这样一个异常错误信息输出的呢?今天栈长分享一个 Spring Boot 启动失败的简单易懂的玩法,让新来的实习生 1 秒都能看出问题。
如果你对 Spring Boot 还不是很熟悉,或者只是会简单的使用,那还是建议你深入学习下吧,推荐这个 Spring Boot 学习仓库,欢迎 Star 关注:
Spring Boot 中注册了许多 "Failure Analyzers",即 "失败分析器",Spring Boot 中的启动失败的场景都是由这些失败分析器拦截处理的。
Spring Boot 提供了 FailureAnalyzers
接口:
package org.springframework.boot.diagnostics;@FunctionalInterfacepublic interface FailureAnalyzer { 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
的源码:
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
异常就会被这个失败分析器拦截并输出可读性的错误信息,现在知道绑定重复绑定错误是怎么输出的了。
从内置的失败分析器中可以发现,所有的分析器都继承了这个抽象基类是:AbstractFailureAnalyzer,它实现了 FailureAnalyzer 接口,一般基于这个抽象基类就可以实现自定义失败分析器的扩展。
下面栈长通过两个示例带大家了解下,如何扩展或者自定义一个 FailureAnalyzer。
比如说上面的PortInUseFailureAnalyzer
输出内容是英文的,不是很直观的看出,我们可以自己实现一个中文的端口失败分析器。
很简单,创建一个失败分析器继承 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
对象,FailureAnalysis
类的三个主要信息分别是:
public FailureAnalysis(String description, String action, Throwable cause) { this.description = description; this.action = action; this.cause = cause;}
即要展示的:可读性的错误描述、建议的检查修复动作、原始异常。
然后在自己的资源目录下创建 META-INF/spring.factories 文件,内容添加:
org.springframework.boot.diagnostics.FailureAnalyzer=\cn.javastack.springboot.features.analyzer.PortInUseFailureAnalyzer
启动输出:
***************************APPLICATION FAILED TO START***************************Description:你启动的端口 8080 被占用了.Action:快检查下端口 8080 被哪个程序占用了,或者强制杀掉进程.
这样重新实现一下是不是要清楚多了?实习生都能看懂!
下面再来自定义一个全新的失败分析器,让大家能更清楚的认识失败分析器。
我们在创建 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技术栈发生异常了……", "赶快去检查一下吧!", cause); }}
添加注册:
org.springframework.boot.diagnostics.FailureAnalyzer=\cn.javastack.springboot.features.analyzer.PortInUseFailureAnalyzer,\cn.javastack.springboot.features.analyzer.JavastackFailureAnalyzer
启动输出:
***************************APPLICATION FAILED TO START***************************Description:Java技术栈发生异常了……Action:赶快去检查一下吧!
如果不注册该失败分析器,这个自定义的异常就不会被内置的失败分析器拦截,就会输出大堆的异常信息,使用失败分析器能很直观的看出是什么错误及怎么修复这个错误。
关于启动Spring Boot 项目失败如何解决问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。
--结束END--
本文标题: 启动Spring Boot 项目失败如何解决
本文链接: https://lsjlt.com/news/247891.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0