如何在Spring Boot启动时控制异常?

时间:2018-05-31 15:03:09

标签: java spring spring-boot

My Spring Boot应用程序尝试在启动时加载一些证书文件。我希望能够在无法加载该文件而不是大量堆栈跟踪时显示合理的消息。

证书文件正在@Component类中的@PostConstruct方法中加载。如果它抛出FileNotFoundException,我会捕获它并抛出我创建的特定异常。我需要在任何情况下抛出异常,因为如果不读取该文件,我不希望加载应用程序。

我试过了:

@SpringBootApplication
public class FileLoadTestApplication {
    public static void main(String[] args) {
        try {
            SpringApplication.run(FileLoadTestApplication .class, args);
        } catch (Exception e) {
            LOGGER.error("Application ending due to an error.");
            if (e.getClass().equals(ConfigException.class)) {
                if (e.getCause().getClass().equals(FileNotFoundException.class)) {
                    LOGGER.error("Unable to read file: " + e.getCause().getMessage());
                } else {
                    LOGGER.error("Initial configuration failed.", e.getCause());
                }
            }
        }
    }
}

但是异常不会在run方法内部抛出。

如何在启动时控制一些异常,以便在关闭前显示信息性消息?

1 个答案:

答案 0 :(得分:4)

你可以抓住BeanCreationException并打开它以获得原始原因。您可以使用以下代码片段

public static void main(String[] args) {
    try {
        SpringApplication.run(FileLoadTestApplication.class, args);
    } catch (BeanCreationException ex) {
        Throwable realCause = unwrap(ex);
        // Perform action based on real cause
    }
}

public static Throwable unwrap(Throwable ex) {
    if (ex != null && BeanCreationException.class.isAssignableFrom(ex.getClass())) {
        return unwrap(ex.getCause());
    } else {
        return ex;
    }
}

@PostConstruct带注释的方法抛出异常时,Spring将其包装在BeanCreationException内并重新抛出。