从静态函数中退出springboot

tquggr8v  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(344)

在我的springboot应用程序中,我使用“utility”类(只有静态方法的类)来验证配置上的业务规则。
例如

@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` 班级。谢谢你的帮助
你好,菲利普
5jdjgkvh

5jdjgkvh1#

我将创建一个 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的更多信息,请参见此处。

相关问题