2015-06-10 4 views
1

Я пытаюсь создать класс конфигурации, который загрузит свойства приложения из файла с помощью аннотации @PropertySource, но PropertySourcesPlaceholderConfigurer, похоже, не устанавливает местоположение, полученное из аннотации.Resolving placeholder в @PropertySource

@Configuration 
@ComponentScan("com.just.a.test") 
@PropertySources({ 
    @PropertySource(value="file:C:\\tmp\\1.cfg" 
      , ignoreResourceNotFound=true) 
}) 
public class TestConfig { 
    @Value("${just.a.string}") 
    String justAString; 


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

файл свойства приложения является:

just.a.string=DOH 

и им получает следующее исключение:

.... причиненного: java.lang.IllegalArgumentException: Не удалось разрешить placeholder 'just.a.string' в строковом значении "$ {just.a.string}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue (PropertyPlaceh olderHelper.java:174)
на org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders (PropertyPlaceholderHelper.java:126)
на org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders (AbstractPropertyResolver.java:204)
в орг .springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders (AbstractPropertyResolver.java:178)
в org.springframework.context.support.PropertySourcesPlaceholderConfigurer $ 2.resolveStringValue (PropertySourcesPlaceholderConfigurer.java:175)
в org.springframework.beans.factory. support.AbstractBeanFactory.resolveEmbeddedValue (AbstractBeanFactory.java:801)
at org.springframework.bea ns.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.java:955)
в org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:942)
на org.springframework.beans.factory. annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredAnnotationBeanPostProcessor.java:533)
... 15 более

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

@Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer(); 
propertySourcesPlaceholderConfigurer.setLocation(new FileSystemResource("c:\\tmp\\1.cfg")); 
     return propertySourcesPlaceholderConfigurer; 
    } 

Я использую Spring 4.1.6-RELEASE и jdk 8.05.

благодарит заранее.

ОБНОВЛЕНИЕ 1

как упомянуто sivaprasadreddy.k.приведенный выше код работает отлично, я забыл, что в моем исходном коде я извлечение файла из виртуальной машины Java паров с использованием -

@PropertySource(value="file:#{systemProperties['config.path']}" 

и пропусканием Jvm из параметров:

-Dconfig.path=C:\\tmp\\1.cfg 

@Sotirios - им просто используя AnnotationConfigApplicationContext (Class), как так -

public static void main(String[] args) { 
new AnnotationConfigApplicationContext(TestConfig.class); 
} 

UPDATE 2

в основном то, что им пытаются достичь это:

1) загрузить файл свойств с помощью Jvm параметров, которые его имя определяется как константный

а) если файл найден, то продолжить

b) иначе, если существует путь к файлу по умолчанию, который определен как константа, существует следующее:

c) else продолжить.

2) попытаться решить @value, используя свойство, которое его имя определяется как константный

а) если найден перейти

б) еще загрузить значения по умолчанию, используя константный.

Извините за пробелы. с редактором что-то не так.

+0

Можете ли вы показать, как вы загружаете свой «TestConfig»? –

+0

Можете ли вы удалить «ignoreResourceNotFound = true» и посмотреть, пытается ли загрузить ресурс? – minion

+0

Я взял ваши фрагменты кода и протестировал с помощью Spring-4.1.6 и JDK 8 и отлично работает. Он разрешает и печатает «DOH», если я вывожу значение justAString. –

ответ

1

Учитывая вашу правку

@PropertySource(value="file:#{systemProperties['config.path']}" 

вы должны сначала понять, что @Configuration класса (и его аннотация) анализируются и обрабатываются до @Bean объявленных внутри него. Другими словами, ваш PropertySourcesPlaceholderConfig (который делает разрешение #{..} заполнителей) не был зарегистрирован к тому времени, когда Spring обработала аннотацию @PropertySource. Он недоступен.

Вместо этого пружина может выполнять подмножество поведения, предоставляемого PropertySourcesPlaceholderConfig, только заполнителями-заполнителями ${..}. (See the javadoc.) И он может использовать только источники ресурсов, уже зарегистрированные с ApplicationContextEnvironment. В ваших примерах есть (должны быть) только два источника, свойства системы и системная среда.

Обозначения

systemProperties['config.path'] 

состояния: дайте мне значение свойства config.path в источнике свойства под названием systemProperties. Я не уверен, в каком порядке Spring проверяет источники собственности, названные выше, но если вы знаете, что только ваши свойства системы (а не среда) имеют config.path свойство, вы можете просто использовать

@PropertySources(value = { @PropertySource(value = "file:${config.path}") }) 
+0

Спасибо Sotirios. Используя $ {..}, я могу теперь успешно загрузить файл в PropertySourcesPlaceholderConfig и разрешить ve значение $ {just.a.string}. Я вижу, что файл находится в PropertySourcesPlaceholderConfig.environment.propertySources = [systemProperties, systemEnvironment, URL [файл: C: //tmp//1.cfg]]}, как бы я все еще не смог разрешить значение, используя # {..} , –

+0

Spring не обрабатывает заполнители, которые начинаются с '# {' в значениях '@ PropertySource'. –

+0

Я имею в виду в @Value, я все еще не могу загрузить свойство, которое я загрузил с помощью @PropertySource ($ {config.path}) –

-1

Попробуйте с:

@Configuration 
@ComponentScan("com.just.a.test") 
@PropertySource(value = {"file:C:/tmp/1.cfg/application.properties", 
        "classpath:config.properties" //if same key, this will 'win' 
            }, ignoreResourceNotFound = true) 
public class TestConfig { 
    @Value("${just.a.string}") 
    String justAString; 


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

Почему? Что это будет делать? Почему «classpath», когда они кажутся хотите получить файл из файловой системы? –

+0

Я согласен с Sotirious Delimanolis, нет причин использовать файл classpath, если мы хотим получить файл непосредственно из файловой системы. –

+0

Отредактирован ответ для доступа к файлу свойств из файловая система – Arpit

Смежные вопросы