将变量传递给@Value注释以从属性文件中读取特定属性

时间:2018-01-17 18:00:02

标签: java spring spring-boot properties properties-file

在我的Spring启动应用程序中,需要从属性文件中读取特定值,具体取决于从另一个函数返回的字符串值。我的属性文件如下:

A=value_a
B=value_b 

函数返回A或B,并将其存储在名为 stringValue 的String变量中。我正在寻找以下几点做的事情:

@Value(stringValue) 
String propertyValue 

但是,我在IDE上收到以下消息:

  

属性值必须是常量

我试图将stringValue转换为静态最终变量,但无济于事。

我知道我可以传递一个特定的密钥来从属性文件中读取,例如:

@Value("${A}")
String valueOfA

我的问题是我是否可以将变量传递给@Value注释?

4 个答案:

答案 0 :(得分:4)

在构建Spring上下文的过程中,

@Value注释在解析期间得到解决。由于此时stringValue不可用,因此您无法将其用于注入目的。

此场景的一个例外是,如果带有@Value注释的bean是原型范围的,在这种情况下,只要请求它就会创建它的新实例。但是,stringValue需要可用于Spring上下文才能在注入点使用。

如果没有看到更多代码,就无法给出更详细的答案。

答案 1 :(得分:1)

您可以在应用程序中自动装配环境,并使用它来读取属性文件,因为它应该在运行时。(这假设所有文件都将您的属性添加到环境中)。

我将以假设发布我的答案,因为您没有更新您的问题,并提供了我要求的所有信息。

所以你的代码是 -

让我们调用你的类来调用一个名为getValue的函数来获取stringValue- Example的值。现在假设您正在调用doSomething()类的方法中的函数getValue。

          class Example{

             @Autowire
             private    Enviornment environment.

            private String propertyValue


            public void doSomething(){

            String value=getValue()// this is where u know whether 
                                              its A or B.
            propertyValue=environment.getProperty(value);

            // do whatever u want know

           }

答案 2 :(得分:1)

感谢帮帮!我将属性文件中的值读入org.springframework.core.io.Resource对象,然后使用它来检索我需要的特定值。以下是我构建解决方案代码的方式:

@Value("classpath:config.properties")
private Resource propertiesfile; 

然后,我声明了一个java.util.Properties对象,并将Resource对象中的值读入其中。

Properties properties = new Properties();

        try{
            properties.load(propertiesfile.getInputStream());
        }catch(IOException e){
            logger.error("Parsing error while reading properties file",e.toString());
        }

最后,根据我的 stringValue 变量中的值,我从属性文件中读取相应的值

String propertyValue = properties.getProperty(stringValue); 

答案 3 :(得分:0)

如果您的变量是另一个环境变量,您可以尝试这种格式。 @Value("${${stringvalue}}")

其中 stringvalue 是环境变量。