从静态函数中退出 Springboot

问题描述

在我的 Springboot 应用程序中,我使用一个“实用程序”类(只有静态方法的类)来验证我的配置中的业务规则。

例如

@Component
public class MyClass  {

    @Autowired
    public MyClass(MyConfig config) {
        MyConfigValidator.validate(config);
    }

...

如果MyConfigValidator.validate()发现配置不一致,则必须退出Springboot应用

据我所知,正确退出 Springboot 应用程序的最佳/唯一方法是运行:

    SpringApplication.exit(context,() -> returnCode);

context一个ApplicationContext 实例必须注入

我的问题来自于 static 方法 MyConfigValidator.validate():静态它无法访问注入的值

让我们看看MyConfigValidator

public class MyConfigValidator {

    public static void validate(MyConfig config) {
        if (!isValid(config)) {
          doExit();
        }
    }

    /// no need to detail here the isValid() method 

   private static void doExit() {
       /// here,I don't kNow how to get the applicationContext
       SpringApplication.exit(applicationContext,() -> returnCode);
   }

}

你知道我怎样才能在我的 ApplicationContext 课上得到 MyConfigValidator。 感谢您的帮助

问候, 菲利普

解决方法

我不会尝试手动关闭应用程序,而是创建一个 ApplicationRunner 来验证应用程序启动时的状态。如果抛出异常,应用程序将无法启动。例如:

@Component
public class SomeInitializer implements ApplicationRunner {

    private MyConfigValidator configValidator;

    // If it's a Spring bean,inject it
    public SomeInitializer(MyConfigValidator configValidator) {
        this.configValidator = configValidator;
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        if (!configValidator.isValid()) {
            throw new IllegalStateException("Some description");
        }
    }
}

此外,如果您想在启动时对配置属性执行验证,您可能需要考虑使用 @Validated @ConfigurationProperties bean:

@Validated
@ConfigurationProperties(prefix="some.prefix")
public class YourProperties {
    @NotEmpty
    private String someProperty;

    // getter and setter
}

有关使用经过验证的 ConfigurationProperties 的更多信息,请参见 here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...