@Value强制启动验证

时间:2017-02-23 09:08:59

标签: spring spring-boot springfox spring-ioc

我有以下弹簧组件。我想找到一种更优雅的方式来注入配置值。

@Component
public class Clazz {

    @Value("${config.value.foo:#{null}}")
    public String foo;

    @PostConstruct
    public validateFoo() throws ConfigException {
        if (foo == null || "".equals(foo)) {
            throw new ConfigException("Please provide config");
        }
    }
}

我使用yaml配置。如果我不添加#{null},配置名称(config.value.foo)将被注入String。另外,如果配置为null或为空,我希望Spring启动应用程序无法启动。

是否有另一个注释会从config中注入值并在未配置值时抛出异常或为null?

修改

如评论@Value中所述,默认行为是在丢失的配置上抛出异常。我测试了这个并且在一个具有相同配置的新项目上工作。如果我删除配置值,我得到:java.lang.IllegalArgumentException: Could not resolve placeholder我想我没有因为我导入的库而得到异常。

1 个答案:

答案 0 :(得分:0)

如果存在以下代码,则可能会发生这种情况:

PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();
c.setIgnoreUnresolvablePlaceholders(true);

我的项目中没有这样的代码,所以我在setIgnoreUnresolvablePlaceholders中添加了一个断点。这个方法叫做:

"main@1" prio=5 tid=0x1 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
      at org.springframework.beans.factory.config.PlaceholderConfigurerSupport.setIgnoreUnresolvablePlaceholders(PlaceholderConfigurerSupport.java:178)
      at springfox.documentation.swagger.configuration.SwaggerCommonConfiguration.swaggerProperties(SwaggerCommonConfiguration.java:38)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

所以这个问题是由springfox引发的。我还禁用了swagger(从我的项目中移除了@EnableSwagger2),然后@Value按预期工作,并在丢失的配置上抛出异常