异常作为默认值 Spring @Value()

Exception as default value of Spring @Value()

我是 Java/Spring 的新手。我需要从配置中读取一些值,但如果它不存在,它应该会失败。现在我有以下代码:

public class SomeClass {

    @Value("${some.property:#{null}}")
    private String someProperty;

    public void someMethod() throws Exception {
        if (someProperty == null) throw new AopConfigException("The property must be set");
    }

}

它工作正常,但我需要添加额外的 if 块。我可以这样写吗?

@Value("${some.property:#{throw new AopConfigException(\"The property must be set\")}}")
private String someProperty;

@Value("${some.property:#{throwException()}}")
private String someProperty;

private static void throwException() {
    throw new AopConfigException("The property must be set");
}

立即失败

更新: 如果我不按照下面的建议使用一些默认值,那么它对我来说仍然不会失败。我没有 java.lang.IllegalArgumentException:

只需在 post 构造中验证以保证它 运行 一旦创建 bean:

@PostConstruct
private static void throwException() {
  if (someProperty == null) {
    throw new AopConfigException("The property must be set");
  }
}

默认情况下需要@Value。所以,只需使用

@Value("${some.property}")

而不是

@Value("${some.property:#{null}}")

因此,如果 属性 不存在,您的应用程序将无法启动,并出现如下异常:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'invalid.value' in value "${invalid.value}"

更新:如果你想有一个密钥并且可以像这样为空:

some.property=

如果 属性 为空,你想抛出异常,然后使用 @PostConstruct 如下:

    @PostConstruct
    public void validateValue() {
        if (someProperty.isEmpty()) {
            throw new MyNiceException("error");
        }
    }

更多更新: 如果您想要初始化 null 以防没有注册表项 as

    @Value("${some.property:#{null}}")
    private String someProperty;

然后这样做:

        @PostConstruct
        public void validateValue() {
            if (someProperty == null) {
                throw new IllegalArgumentException("error");
            }
        }

请不要给你的属性赞一个默认值 @Value("${some.property}")

And in case the property is not set spring will through an exception and you are done right.

恐怕您不能只使用 @Value 注释来做到这一点。但是,您可以通过使用 spring 环境读取值来检查是否设置了某个 属性。如果未设置值,这将抛出 IllegalStateException

因此,例如,如果您有环境变量,例如:

@Autowired
private ConfigurableEnvironment env;

然后你可以通过调用getRequiredProperty:

方法来初始化这个值
<T> T getRequiredProperty(java.lang.String key, java.lang.Class<T> targetType) 
      throws java.lang.IllegalStateException

因此对于您的用例,您将像这样初始化您的 bean:

@Bean
public SomeClass someClass () {

  String someProperty = env.getRequiredProperty ("some.property");

  return new SomeClass (someProperty);
}

为了使 属性 替换正常工作,您需要像这样 (example taken from here):

添加一个 PropertySourcesPlaceholderConfigurer bean 到您的配置中
@Bean
public static PropertySourcesPlaceholderConfigurer properties(){
  final PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
  // add your property files below
  final Resource[] resources = new ClassPathResource[]{new ClassPathResource("foo.properties")};
  pspc.setLocations( resources );
  // this will make the replacement fail, if property is not known
  pspc.setIgnoreUnresolvablePlaceholders(false); 
  return pspc;
}

如果您已经使用 @PropertySource 注释配置 属性 源,您应该能够省略手动将资源添加到 PropertySourcesPlaceholderConfigurer,因为它应该从 [=24] 中获取值=] 环境自动.

一旦这个 bean 就位,只需使用

@Value("${data.import.path}")

如果没有默认设置(如其他答案中所述),您的应用程序初始化将在很早的阶段失败。