【问题标题】:Passing a variable to @Value annotation for reading specific property from properties file将变量传递给 @Value 注释以从属性文件中读取特定属性
【发布时间】:2018-06-26 16:45:31
【问题描述】:

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

A=value_a
B=value_b 

A 函数返回 A 或 B,并将其存储在名为 stringValue 的字符串变量中。我正在寻找按照以下方式做的事情:

@Value(stringValue) 
String propertyValue 

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

属性值必须是常量

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

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

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

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

【问题讨论】:

  • 包含变量 stringValue 的 d bean 的名称是什么?
  • 能否发布更多代码,包括您使用@Value 的类以及如果您的返回值的函数在另一个类中,那么该类的代码也是如此。
  • 我已经注释了我使用 @Value 注释和 @PropertySource("classpath:config.properties") 注释的类,因为我想从 config.properties 文件中读取值。
  • 没关系。你可以发布更多代码吗?包括我上面提到的类。

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


【解决方案1】:

@Value 注解在启动时解析,当 Spring 上下文建立时。由于此时stringValue 不可用,因此您不能将其用于注入目的。

这种情况的一个例外是如果带有@Value 注释的bean 是原型范围的,在这种情况下,它的新实例将在任何时候被请求时创建。尽管如此,stringValue 仍需要可用于 Spring 上下文才能在注入点使用。

没有看到更多代码,不可能给你更详细的答案。

【讨论】:

    【解决方案2】:

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

    由于您尚未更新您的问题,我将发布我的假设答案,以及我要求的所有信息。

    所以你的代码是-

    让我们调用您的类,您可以在其中调用一个名为 getValue 的函数来获取 stringValue- 示例的值。现在假设您正在调用类示例中名为 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
    
               }
    

    【讨论】:

      【解决方案3】:

      感谢大家的帮助!我将属性文件中的值读入 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); 
      

      【讨论】:

        【解决方案4】:

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

        其中 stringvalue 是环境变量。

        【讨论】:

          猜你喜欢
          • 2022-06-20
          • 1970-01-01
          • 1970-01-01
          • 2021-12-30
          • 2015-11-14
          • 2017-10-14
          • 2018-08-11
          • 2017-07-09
          • 2021-02-04
          相关资源
          最近更新 更多