问题描述
在我的 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。