【问题标题】:How to handle exceptions during spring-boot start-up?spring-boot启动过程中如何处理异常?
【发布时间】:2019-02-18 05:13:17
【问题描述】:

这不是关于如何处理 Spring MVC 中的异常或其他任何东西。我特别需要处理 spring 开始时可能发生的异常,即在整个应用程序上下文甚至初始化之前。

对于一些背景知识,有问题的应用程序是一个允许远程访问电子设备的 IoT 节点。它内置了一个小的 h2 数据库来保存一些数据。这些数据在某些时候很不错,但对于应用程序的工作来说并不是必不可少的。

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

有一种明显的方法可以做到这一点,即将 SpringApplication.run 放在 try-catch 块中。但这也很丑陋,因为我得到了我正在寻找的异常嵌套在由 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

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

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    取决于您如何声明 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()
        {
            //...
        }
    }
    

    【讨论】:

    • 两个原因:一,我对 spring-boot 很烂,甚至没有考虑这一点,不幸的是,二,整个 DB 充当 Quartz Job-store 并且由 spring 本身设置。代码中没有 bean 实例化它。我不太确定自己要如何实例化它……(见原因一)。
    • spring是如何实例化的呢?您必须包含一些依赖项,或者您定义的一些属性,或者其他东西。请使用这些详细信息编辑您的问题。
    • @UncleBob 谢谢。鉴于该信息,我认为您必须使用启动器。类似于spring-boot-starter-jdbcspring-boot-starter-data-jpa。你有这样的事吗?
    • 确实,依赖项中有 spring-boot-starter-quartz 和 spring-boot-starter-jdbc。
    • 酷。您基本上需要这样做来覆盖自动配置:stackoverflow.com/questions/28821521/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2016-09-29
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多