2016-01-04 43 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}分裂了$性格让规划环境地政司不会尝试将其评价为一个表达式,因为就它而言,你只是将两个字符串连接在一起。

+0

是否有一些额外的配置,需要添加到获得春评价#{..}内的表达式? 我尝试将属性更改为'#{'$'+'{person.surname}'}'但'getPersonExpression()'刚刚返回'#{'$'+'{person.surname}'}' – IgorK

+0

使用'PropertyPlaceholderConfigurer' bean?这应该读取您的属性文件,解析值,然后使其可用。如果你不是,那么属性文件将不会使用SpEL进行分析。 – JamesENL

+0

是的,这是问题。我没有注册PropertyPlaceholderConfigurer bean,因为没有其他正在评估的属性。加入\t'@Bean \t public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){ \t \t return new PropertySourcesPlaceholderConfigurer(); \t}'做了诡计。此外,我搞砸了格式化了一下,并将属性更改为'personExpression =#{'$'} {person.surname}'这仍然有效,并且更容易阅读 – IgorK

1

我不知道任何getRawPropertyValue类型的方法,可通过ApplicationContext访问。

如果你知道你的名字PropertySource,例如。 example,您可以获得ConfigurableEnvironment及其注册PropertySource,检索相应的一个,并获取所需的属性值。

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

在我的情况下,我能够在'ConfigurableEnvironment'中'@ Autowire'并跳过检索上下文。一切都是一样的。 –

-1

你可能知道这一点,但我只是澄清$ {}用于从属性文件中检索属性到XML文件/任何其他有效的文件中。

如果您正在尝试设置personExpression =“person.surname”,并且想要像上面那样进行检索(environment.getProperty(“personExpression”);),您应该像这样定义personExpression = person.surname在您的属性文件中。那么它将与environment.getProperty(“personExpression”);并返回person.surname在您的功能,希望这可以帮助