Spring Boot 教程

创建自己的 FailureAnalyzer

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 程序,错误信息输出如下:

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号