Spring @Value аннотация не использует значения по умолчанию, когда свойство отсутствует - PullRequest
21 голосов
/ 15 января 2011

Я пытаюсь использовать аннотацию @Value в параметрах конструктора следующим образом:

@Autowired
public StringEncryptor(
    @Value("${encryptor.password:\"\"}") String password,
    @Value("${encryptor.algorithm:\"PBEWithMD5AndTripleDES\"}") String algorithm,
    @Value("${encryptor.poolSize:10}") Integer poolSize, 
    @Value("${encryptor.salt:\"\"}") String salt) {
...
}

Когда файл свойств присутствует в пути к классам, свойства загружаются идеально, и тест выполняется нормально. Однако, когда я удаляю файл свойств из пути к классам, я ожидал, что будут использоваться значения по умолчанию, например, poolSize будет установлен в 10 или алгоритм PBEWithMD5AndTripleDES, однако это не так.

Выполнение кода через отладчик (который будет работать только после изменения @Value("${encryptor.poolSize:10}") Integer poolSize на @Value("${encryptor.poolSize:10}") String poolSize, как это вызывало NumberFormatExceptions). Я обнаружил, что значения по умолчанию не установлены и параметры имеют вид:

poolSize = ${encryptor.poolSize:10} или

algorithm = ${encryptor.algorithm:"PBEWithMD5AndTripleDES"}

вместо ожидаемого

poolSize = 10 или

algorithm = "PBEWithMD5AndTripleDES"

На основе SPR-4785 должна работать нотация, такая как $ {my.property:myDefaultValue}. Все же это не происходит для меня!

Спасибо

Ответы [ 3 ]

23 голосов
/ 15 января 2011

Возможно, инициализация конфигуратора заполнителя свойства завершается неудачно из-за пропущенного файла свойств, поэтому заполнители не разрешаются.Вы можете настроить его так, чтобы он игнорировал пропущенные файлы следующим образом (если вы используете context пространство имен для его настройки):

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

Также вам не нужно "..." для значений по умолчанию.

6 голосов
/ 22 июня 2011

ignore-resource-not-found = "true" не требуется для выбора значений по умолчанию. Смысл указания значения по умолчанию - использовать его, если свойство нигде не найдено.

Я думаю, что последнее предложение в предыдущем ответе указывает на проблему - неправильный EL, который вы должны были изначально предоставить, но затем удалить из примера. Тот факт, что вы получаете исключения преобразования формата, также указывает на это. Как правило, Spring автоматически преобразует строки в соответствующий «стандартный» тип Java, и если вы предоставляете собственную реализацию службы преобразования Spring, также и в свои пользовательские объекты - при условии, что ваша служба преобразования определена в контексте приложения.

«ignore-resource-not-found» полезен, когда вы вводите свойства через XML без значений по умолчанию и не хотите, чтобы контейнер генерировал исключение, создающее экземпляр компонента в случае, если свойство не найдено. В таких случаях свойства компонента будут инициализированы с настройками Java по умолчанию, например, NULL для объектов, 0 для простых числовых значений и т. д.

2 голосов
/ 10 апреля 2015

В моем случае разрешение значений свойств (и значений по умолчанию) не сработало в тесте, где я использую конфигурацию на основе аннотаций. Оказалось, что мне пришлось добавить PropertySourcesPlaceholderConfigurer, чтобы свойства действительно были разрешены. Это было объяснено в аннотации PropertySource JavaDoc :

Чтобы разрешить $ {...} заполнителей в определениях или аннотациях @Value с использованием свойств из PropertySource, необходимо зарегистрировать PropertySourcesPlaceholderConfigurer . Это происходит автоматически при использовании в XML, но должно быть явно зарегистрировано с использованием статического метода @Bean при использовании классов @Configuration. См. Раздел «Работа с внешними значениями» @Configuration Javadoc и «примечание о BeanFactoryPostProcessor-возвращающих методах @Bean» @Bean Javadoc для получения подробной информации и примеров.

Следующие действия сделали:

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

А если вы хотите добавить отдельные свойства:

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {

    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();

    Properties properties = new Properties();
    properties.put("batchSize", "250");
    propertySourcesPlaceholderConfigurer.setProperties(properties);

    return propertySourcesPlaceholderConfigurer;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...