2016-01-04 2 views
3

Я пытаюсь определить следующее свойство в одном из моих файлов .properties:Как получить необработанную стоимость имущества, содержащего заполнители?

personExpression=${person.surname} 

Это тот прочитанный класс конфигурации:

@Configuration 
public class TemplateConfig { 
    @Autowired 
    private Environment environment; 

    public String getPersonExpression() { 
     return environment.getProperty("personExpression"); 
    } 
} 

Однако это дает исключение:

java.lang.IllegalArgumentException: Could not resolve placeholder 'person.surname' in string value "${person.surname}" 

Есть ли способ сделать getPersonExpression(), чтобы вернуть строковый литерал ${person.surname}, не пытаясь его решить?

ответ

1

Чтобы получить это на работу, требуется довольно неинтуитивный синтаксис.

Вы по существу должны разделить свое выражение на две части и обернуть все это в родительском выражении SpEL, чтобы присоединиться к ним.

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

personExpression=#{'$' + '{person.surname}'} 

Это работает, потому что вы дробя $ персонажа из {person.surname} так SPEL не будет пытаться оценить его как выражение , поскольку, насколько это важно, вы просто объединяете две строки вместе.

+0

Есть ли какая-то дополнительная конфигурация, которую нужно добавить, чтобы получить весну для оценки выражений внутри # {..}? Я попытался изменить свойство на '# {'$' + '{person.surname}'}', но 'getPersonExpression()' просто возвращает '# {'$' + '{person.surname}'}' – IgorK

+0

Вы используя компонент «PropertyPlaceholderConfigurer»? Это должно прочитать ваш файл свойств, проанализировать значения и затем сделать их доступными. Если вы этого не сделаете, файл свойств не будет анализироваться с использованием SpEL. – JamesENL

+0

Да, это была проблема.У меня не было зарегистрирован компонент «PropertyPlaceholderConfigurer», поскольку не было других свойств, которые были оценены. Добавление в \t '@Bean \t общественности статической PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { \t \t возвращение новый PropertySourcesPlaceholderConfigurer(); \t} 'сделал трюк. Кроме того, я немного испортил форматирование и изменил свойство на 'personExpression = # {'$'} {person.surname}', который все еще работает и немного легче читать – IgorK

1

Я не знаю ни одного метода getRawPropertyValue, который доступен через ApplicationContext.

Если вы знаете имя своего PropertySource, напр. example, вы можете получить ConfigurableEnvironment, а его зарегистрированный PropertySource s, получить соответствующий и получить требуемое значение свойства.

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Sample.class); 
ConfigurableEnvironment configurableEnvironment = ctx.getEnvironment(); 
String rawValue = configurableEnvironment.getPropertySources() 
         .get("example") // get property source 
         .getProperty("personExpression"); // get property 

переменная rawValue будет иметь значение ${person.surname}. Все это делается за пределами каких-либо других владельцев.

Это, очевидно, будет работать только для источников собственности, зарегистрированных в Environment.

+0

В моем случае я смог '@ Autowire' в' ConfigurableEnvironment' и пропустить извлечение контекст. Все одно и то же. –

-1

Возможно, вы знаете это, но я просто уточняю, что $ {} используется для извлечения свойства из файла свойств в файл XML/любой другой файл, где он действителен.

Если вы пытаетесь установить personExpression = "person.surname" и хотите получить его, как вы делаете это выше (environment.getProperty ("personExpression");), вы должны определить как это personExpression = person.surname в вашем файле свойств. то он будет работать с environment.getProperty («personExpression»); и возвращает person.surname в вашей функции, надеюсь, что это поможет

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