我有以下弹簧组件。我想找到一种更优雅的方式来注入配置值。
@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
我想我没有因为我导入的库而得到异常。
答案 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按预期工作,并在丢失的配置上抛出异常