Как правильно указать значение по умолчанию в аннотации Spring @Value?

Вначале у меня есть следующая спецификация:

@Value("#{props.isFPL}")
private boolean isFPL=false;

Это прекрасно работает, получая значение из файла свойств:

isFPL = true

Однако следующее выражение по умолчанию приводит к ошибке:

@Value("#{props.isFPL:false}")
private boolean isFPL=false;

Не удалось выполнить синтаксический анализ выражений; Вложенное исключение - org.springframework.expression.spel.SpelParseException: EL1041E: (поз. 28): после разбора допустимого выражения в выражении еще больше данных: "двоеточие (:)"

Я также пытался использовать $вместо #.

@Value("${props.isFPL:true}")
private boolean isFPL=false;

Тогда значение по умолчанию в аннотации отлично работает, но я не получил правильное значение из файла свойств:

Ответы

Ответ 1

Попробуйте использовать $следующим образом

@Value("${props.isFPL:true}")
private boolean isFPL=false;

также убедитесь, что для параметра ignore-resource-no-found установлено значение true, чтобы в случае отсутствия файла свойства было принято значение по умолчанию.

Кроме того, поместите следующее в

файл контекста при использовании конфигурации на основе xm:

<context:property-placeholder ignore-resource-not-found="true"/>

в классе конфигурации. При использовании конфигураций Java:

 @Bean
 public static PropertySourcesPlaceholderConfigurer   propertySourcesPlaceholderConfigurer() {
     PropertySourcesPlaceholderConfigurer p =  new PropertySourcesPlaceholderConfigurer();
     p.setIgnoreResourceNotFound(true);

    return p;
 }

Ответ 2

Использует ли ваш контекстный файл приложения Spring более одного свойстваPlaceholder beans, как показано ниже:

<context:property-placeholder ignore-resource-not-found="true" ignore-unresolvable="true" location="classpath*:/*.local.properties" />
<context:property-placeholder location="classpath:/config.properties" />

Если это так, то поиск свойств для: props.isFPL будет выполняться только для первого файла свойства (.local.properties), если свойство не найдено, значение по умолчанию (true) вступит в силу, а второй файл свойства ( config.properties) эффективно игнорируется для этого свойства.

Ответ 3

Для переменной int:

@Value("${my.int.config: #{100}}")
int myIntConfig;

Примечание. нет пробела перед двоеточием, но дополнительное пространство после двоеточия.

Ответ 4

В зависимости от того, как вы загружаете свои свойства, если вы используете что-то вроде

<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />

Тогда @Value должно выглядеть как

@Value("${isFPL:true}")

Ответ 5

Для String вы можете по умолчанию иметь нулевое значение:

public UrlTester(@Value("${testUrl:}") String url) {
    this.url = url;
}