FailureAnalyzer 是一种很好的方式在启动时拦截异常并将其转换为易读的消息,并将其包含在 FailureAnalysis 中。
Spring Boot 为应用程序上下文相关异常、JSR-303 验证等提供了此类分析器。 实际上可以非常容易创建自己的 FailureAnalyzer。
AbstractFailureAnalyzer 是 FailureAnalyzer 的一个抽象实现,它检查要处理的异常中是否存在指定的异常类型。
我们可以从中进行扩展,以便存在指定的异常时有机会去处理。如果由于某种原因无法处理异常,则返回 null 以使另一个实现有机会处理异常。
FailureAnalyzer 实现将在 META-INF/spring.factories 中注册:
# 自己的 FailureAnalyzer org.springframework.boot.diagnostics.FailureAnalyzer=com.example.ProjectConstraintViolationFailureAnalyzer
自定义 FailureAnalyzer,用来检查 java.lang.NullPointerException 异常,输出易读的消息。
(1)继承 AbstractFailureAnalyzer,重写 analyze 方法,返回 FailureAnalysis。代码如下:
import org.springframework.boot.diagnostics.AbstractFailureAnalyzer; import org.springframework.boot.diagnostics.FailureAnalysis; public class MyFailureAnalyzer extends AbstractFailureAnalyzer<NullPointerException> { @Override protected FailureAnalysis analyze(Throwable rootFailure, NullPointerException cause) { return new FailureAnalysis(cause.getMessage(), "空指针异常,请仔细检查", cause); } }
(2)在 src/main/resources/META-INF 目录中添加 spring.factories,并注册自定义的 FailureAnalyzer:
# 注册自定义的FailureAnalyzer org.springframework.boot.diagnostics.FailureAnalyzer=com.huangx.springboot.springapplication.MyFailureAnalyzer
(3)创建一个 Bean,在 Bean 的默认构造方法中模拟一个 NullPointerException 异常。SpringBoot 在启动时会采用默认构造方法创建这个 bean,默认构造方法会抛出 java.lang.NullPointerException 运行时异常,此时可通过自定义的 FailureAnalyzer 进行捕获并处理该异常。代码如下:
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.text.SimpleDateFormat; import java.util.Date; @RestController public class IndexController { public IndexController() { System.out.println("Init IndexController"); SimpleDateFormat simpleDateFormat = null; if(System.currentTimeMillis() % 100 == 0) { simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } System.out.println("DATE::" + simpleDateFormat.format(new Date())); } @RequestMapping("/") public String index() { return "Spring Boot SpringApplication"; } }
上面代码中,simpleDateFormat.format(new Date())) 代码可能会抛出 NullPointerException 异常。
(4)启动 Spring Boot 程序,错误信息输出如下: