java - spring-boot启动过程中出现异常如何处理?

标签 java spring spring-boot

这不是关于如何处理 Spring MVC 中的异常或其他内容。我特别需要处理 Spring 启动时(即在整个应用程序上下文初始化之前)可能发生的异常。

了解一些背景知识,所讨论的应用程序是一个允许远程访问电子设备的物联网节点。它内置了一个小型 h2 数据库来保存一些数据。在某些时候拥有这些数据很好,但对于应用程序的工作来说并不是必需的。

碰巧的是,运行应用程序的设备偶尔会断电,如果在对数据库进行写操作时发生这种情况,则文件会损坏,并且会出现 JdbcSQLException当应用程序尝试再次启动时抛出。 由于数据并不是真正重要的,因此使应用程序再次运行的最简单方法是删除数据库并让 h2 重新创建它。但为了做到这一点,我必须捕获异常,以便我可以对其使用react。应用程序不必必须继续启动,它将由systemd 再次启动。我真的只需要识别异常并删除文件,就是这样。

有一种明显的方法可以做到这一点,即将 SpringApplication.run 放在 try-catch block 中。但它也非常丑陋,因为我得到了我正在寻找的异常,该异常嵌套在由 h2 无法启动引起的无数 Spring 异常中。

也有人建议我在实例化数据库的bean中捕获异常,但不幸的是没有实例化它的bean。 DB 充当 Quartz 作业存储,因此完全由 spring 管理。它在代码中的全部存在是属性文件中的以下条目:

spring.quartz.job-store-type=jdbc
spring.quartz.properties.org.quartz.jobStore.misfireThreshold=900000
spring.datasource.name=h2
spring.datasource.url=jdbc:h2:file:${config.folder}controller
spring.datasource.driverClassName=org.h2.Driver

我的问题是,有没有办法注册某种异常处理程序或其他方式,以便在异常发生时直接处理异常,这样我可以更轻松地识别它?

最佳答案

取决于您如何声明 bean。像这样简单地包裹 bean 有什么问题吗?

@Configuration
class Conf {
    @Bean
    public DB foo() throws JdbcSQLException
    {
        try
        {
            return new DB();
        }
        catch(JdbcSQLException e)
        {
            deleteDatabase();
            throw JdbcSQLException;
        }
    }

    public static void deleteDatabase()
    {
        //...
    }
}

关于java - spring-boot启动过程中出现异常如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52314194/

相关文章:

java - org.hibernate.service.UnknownServiceException : Unknown service requested [org. hibernate.ogm.service.impl.OgmConfigurationService]

java - org.hibernate.LazyInitializationException : could not initialize proxy - no Session , 表示没有 getter,但我的 getter/setter 存在

spring - 我怎么知道应该将哪个 maven 依赖添加到 pom.xml

java - Elasticsearch :将客户端传输到高级其余客户端

spring-boot - 通过Jenkins SCM(Jenkinsfile和代码一起 repo )构建和运行Docker镜像,Jenkins本身使用dockerfile在docker中运行

java - SpringRunner 与 SpringBootTest

java - 有没有办法将相同的对象添加到 ArrayList,但更改值而不重写 ArrayList 的其他元素?

java - 客户端发送的请求在语法上错误

java - 在 CXF Spring Boot 中注册过滤器

java - 如何在Windows中模仿Unix文件系统?