当前位置: 首页 > 知识库问答 >
问题:

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

田丰
2023-03-14

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

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

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

有一种明显的方法可以做到这一点,那就是将SpringApplication放进去。在try-catch块中运行。但这也很难看,因为我得到了一个我正在寻找的嵌套在无数spring异常中的异常,这些异常是由h2无法启动引起的。

还有人建议我在实例化数据库的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

我的问题是,有没有一种方法可以注册某种异常处理程序,或者其他方法,在异常发生时直接处理异常,而我可以更容易地识别它?

共有1个答案

宗政海
2023-03-14

取决于您如何声明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批处理文档,无法异步运行我的作业。 因此,我从一个web容器运行该作业,该作业将通过RESTendpoint触发。 我想让JobInstance ID在完成整个作业之前传递它作为响应。因此,他们可以稍后使用JobInstance ID检查作业的状态,而不是等待。但我没能让它工作。下面是我尝试过的示例代码。请让我知道我错过了什么或错了什么。 BatchConfig创建异步JobL

  • 在Spring Boot上下文的初始化过程中,有什么方法可以处理异常吗? 我的案例是在作业执行过程中处理错误,并根据发生的异常做一些工作。 例如,我有一个由读者和作家组成的工作。读取器和写入器使用以下属性初始化:rootFolder、inFolder、outfolder。这个简单的作业从/rootfolder/infolder/test.txt读取文件,并将数据写入rootfolder/outfo

  • 我尝试用的一个实例替换错误处理程序,但没有成功。 我尝试创建自己的CustomErrorHandler,但这也不合适,因为在重新路由到自定义错误控制器时,原始异常已不再存在于该异常中。为了向客户端返回适当的响应,需要这些信息。 吾如何曰: 使SpringBoot不将异常转发到异常控制器。 还原@ControllerAdvice异常处理程序,这样我就可以返回适当的响应正文和状态代码。

  • 我有一个Spring Boot应用程序,它有一些外部依赖(例如,项目之外的文件,需要存在,以便应用程序正确启动)。 和一系列其他例外。有没有一种方法可以恰当地做到这一点?

  • 有人能简单地解释一下如何将我的域对象添加到apachemq可信对象吗。已经仔细阅读了apache教程,其中说需要将脚本添加到/bin/env,但我的bin文件夹中没有env文件。谢谢 2016-04-08 16:55:49错误提示控制器:23-控制器方面:方法例外-

  • 问题内容: java.time中的类仅处理面向日期的部分:年,月,日。 时间部分呢:小时,分钟,秒? 我们如何解析和生成中定义的完整时间段的字符串表示ISO 8601 ,?例如,一天半:。学年为九个月。每年我有两个星期零三天的假期。客户在酒店房间里呆了2天17个半小时。 Joda-Time的课程为全日制。为什么不在java.time中?还有其他机制吗? 问题答案: 该 ThreeTen-EXTRA