@Value не разрешается при использовании annotations @PropertySource. Как настроить PropertySourcesPlaceholderConfigurer?

У меня следующий class конфигурации:

@Configuration @PropertySource(name = "props", value = "classpath:/app-config.properties") @ComponentScan("service") public class AppConfig { 

и у меня есть сервис с недвижимостью:

 @Component public class SomeService { @Value("#{props['some.property']}") private String someProperty; 

Я получаю ошибку, когда хочу протестировать class конфигурации AppConfig с помощью

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'someService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String service.SomeService.someProperty; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'props' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' 

Проблема задокументирована в SPR-8539

но в любом случае я не могу понять, как настроить PropertySourcesPlaceholderConfigurer, чтобы он работал.

Редактировать 1

Этот подход хорошо работает с конфигурацией xml

  

но я хочу использовать java для конфигурации.

Если вы используете @PropertySource, свойства должны быть получены с помощью:

 @Autowired Environment env; // ... String subject = env.getProperty("mail.subject"); 

Если вы хотите получить с помощью @Value (“$ {mail.subject}”), вам необходимо зарегистрировать местозадержатель прошивки по xml.

Причина: https://jira.springsource.org/browse/SPR-8539

как сказал @cwash;

 @Configuration @PropertySource("classpath:/test-config.properties") public class TestConfig { @Value("${name}") public String name; //You need this @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } } к @Configuration @PropertySource("classpath:/test-config.properties") public class TestConfig { @Value("${name}") public String name; //You need this @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } } 

Я нашел причину, по которой @value не работал для меня, @value требует PropertySourcesPlaceholderConfigurer вместо PropertyPlaceholderConfigurer . Я сделал те же самые изменения, и это сработало для меня, я использую версию весны 4.0.3. Я сконфигурировал это, используя код ниже в моем файле конфигурации.

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

Вам не нужен метод в classе @Configuration, который возвращает PropertySourcesPlaceholderConfigurer, аннотированный @Bean и является статическим, чтобы зарегистрировать любой источник @PropertySource с Spring?

http://www.baeldung.com/2012/02/06/properties-with-spring/#java

https://jira.springsource.org/browse/SPR-8539

У меня была такая же проблема. @PropertySource плохо работает с @Value . Быстрое обходное решение состоит в том, чтобы иметь конфигурацию XML, которую вы будете ссылаться на нее из конфигурации Spring Java с использованием @ImportResource как обычно, и что файл конфигурации XML будет содержать одну запись: (конечно, с необходима церемония пространства имен). Без каких-либо других изменений @Value будет вводить свойства в ваше @Configuration pojo.

Это также можно настроить в java таким образом

 @Bean public static PropertySourcesPlaceholderConfigurer properties() { PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); configurer.setIgnoreUnresolvablePlaceholders(true); configurer.setIgnoreResourceNotFound(true); return configurer; } 

Это выглядит очень сложно, не так ли?

   

затем в ссылке на код:

 @Value("${myProperty}") private String myString; @Value("${myProperty.two}") private String myStringTwo; 

где some.properties выглядит примерно так

 myProperty = whatever myProperty.two = something else\ that consists of multiline string 

Для java-конфигурации вы можете сделать это

 @Configuration @PropertySource(value="classpath:some.properties") public class SomeService { к @Configuration @PropertySource(value="classpath:some.properties") public class SomeService { 

А затем просто введите значение @value как и раньше

Дело в том, что, насколько я понимаю, , является просто сокращением для

    

(см. документацию на использование: свойства ). Таким образом, при использовании util: properties создается автономный компонент.

@PropertySource, с другой стороны, как говорится в документации, это

annotations, обеспечивающей удобный и декларативный механизм добавления PropertySource в среду Spring ‘.

(см. документ @PropertySource ). Поэтому он не создает никаких компонентов.

Тогда «# {a [‘something’]}” является выражением SpEL (см. SpEL ), что означает «получить что-то из bean -a». Когда используется: свойства используются, компонент существует и выражение имеет смысл, но когда используется @PropertySource, фактического компонента нет, а выражение не имеет смысла.

Вы можете обойти это либо с помощью XML (что лучше всего, я думаю), так и путем создания PropertyFactoryBean самостоятельно, объявив его как обычный @Bean.

Еще одна вещь, которая может произойти: убедитесь, что аннотированные значения @Value не являются статическими.

  • Как java-настроить отдельные источники данных для весенних пакетных данных и бизнес-данных? Должен ли я это сделать?
  • Как использовать Spring Security без сеансов?
  • Каковы преимущества контейнеров для инъекций зависимостей?
  • Как избежать исключения «Circular view path» с использованием теста Spring MVC
  • Spring Autowiring class vs. interface?
  • Весенние данные и исходный запрос с разбивкой на страницы
  • Данные Spring: поддерживается «delete by»?
  • Setter DI или Constructor DI весной?
  • определить целевой URL на основе ролей в весенней безопасности 3.1
  • Загрузка файлов с помощью API-интерфейса Angular2 в REST
  • Как использовать Spring перехватчики Hibernate в Spring Boot?
  • Давайте будем гением компьютера.