首页 > 解决方案 > 从静态函数中退出 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课上得到。谢谢您的帮助

问候,菲利普

标签: javaspringspring-bootexitshutdown

解决方案


我不会尝试手动关闭应用程序,而是创建一个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 @ConfigurationPropertiesbean:

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

    // getter and setter
}

可以在此处找到有关使用经过验证的 ConfigurationProperties 的更多信息。


推荐阅读