如何在 Spring 启动期间处理异常?



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

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

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

有一个明显的方法可以做到这一点,那就是将 SpringApplication.run 放在一个 try-catch 块中。但它也非常丑陋,因为我得到了我正在寻找的异常,它嵌套在由 h2 无法启动引起的大量弹簧异常中。

还建议我在实例化数据库的 bean 中捕获异常,但不幸的是没有 bean 实例化它。DB用作石英作业商店,因此完全由弹簧管理。它在代码中的全部存在是属性文件中的以下条目:

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。简单地这样包豆子有什么问题?

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

最新更新