【问题标题】:Reading values from application.properties Spring Boot从 application.properties Spring Boot 中读取值
【发布时间】:2018-01-07 18:57:00
【问题描述】:

我的 Spring Boot 应用程序具有以下应用程序结构:

    • 主要
      • java
      • 资源
        • application.properties

这是我的 application.properties 文件:

logging.level.org.springframework=TRACE
logging.level.org.hibernate=ERROR
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
#spring.resources.chain.cache=false
#spring.resources.chain.html-application-cache=false
#spring.headers.cache=false
language=java

我有一个需要使用 language=java 属性的类。这就是我尝试使用它的方式:

public class EntityManager {

    @Value("${language}")
    private static String newLang;

    public EntityManager(){
        System.out.println("langauge is: " + newLang);
    }
}

由于某种原因,打印的 值始终为“null”!我也试过把它放在类声明的顶部:

@PropertySource(value = "classpath:application.properties")

【问题讨论】:

  • 如果我的回答为您提供了解决方案,请采纳。

标签: java spring spring-mvc


【解决方案1】:

可以通过多种方式实现,参考下文。

@Configuration
@PropertySource("classpath:application.properties")
public class EntityManager {

    @Value("${language}")
    private static String newLang;

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

}

@Configuration
@PropertySource("classpath:application.properties")
public class EntityManager {

    @Autowired
    private Environment env;

    public void readProperty() {
        env.getProperty("language");
    }

}

【讨论】:

  • 它仍然无法使用 @PropertySource 注释。我不知道为什么,但我猜它找不到 application.properties 文件?有没有办法检查“类路径”指的是什么路径?
  • @aBrokenSniper,application.properties 在类路径中可用吗?你项目中application.properties的路径是什么?
  • @aBrokenSniper,或者你也可以使用文件路径.. @PropertySource("file:/path/to/application.properties")
  • 我将 application.properties 放在 spring 文档建议的默认位置:在 src>main>resources>application.properties 下。应该是默认拾取吧?
  • 是的,应该默认拾取。如果没有,请尝试使用我上面评论的文件路径
【解决方案2】:

如果您使用的是 Spring boot,则不需要 @PropertySource("classpath:application.properties") 如果您使用的是 spring boot starter parent,只需删除 static 关键字,它就应该开始工作了。

【讨论】:

  • any-name.properties 还可以吗?
【解决方案3】:

类顶部缺少原型注释

@Component
public class EntityManager {

    @Value("${language}")
    private static String newLang;

    public EntityManager(){
        System.out.println("langauge is: " + newLang);
    }
}

【讨论】:

  • 必须是组件吗?我正在阅读本教程:link,他们没有使用组件。有什么方法可以在不为类使用任何原型注释的情况下从属性文件中获取值?
  • 它可以是任何一种 spring 原型注解。在这种情况下,您可以通过在类中静态访问 ApplicationContext 来从 Environment 中获取它,或者使用 System.getProperty 来获取 JVM 属性。
【解决方案4】:

有时,src/main/resources 的类路径条目包含排除标记。如果application.properties 出现在此排除项目列表中,则@PropertySource("classpath:application.properties") 将无法找到属性文件。

要么从 [.classpath][1] 文件中手动删除 src/main/resources 的排除条目,要么使用 Eclipse 中的配置构建路径选项并转到源选项卡。然后从src 中删除排除条目。

【讨论】:

    【解决方案5】:

    可能不是您正在寻找的确切解决方案,但您也可以声明一个属性源 bean:

    https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/PropertySource.html

    【讨论】:

      【解决方案6】:

      好吧,我绝望地想出来了。我添加了

      @PropertySource("classpath:application.properties") 
      

      属性,但由于某种原因它仍然无法正常工作。

      然后我删除了“静态”修饰符,它起作用了!

      我不确定为什么它在没有“静态”的情况下可以工作,但确实可以。如果可以向我解释,那就太好了,因为这一切都令人困惑。

      【解决方案7】:

      创造你的豆子

      @Configuration
      @PropertySource("classpath:application.properties")
      public class ApplicationBeansConfig {
      
          @Autowired
          Environment env;
      
          @Bean
          public IApplicationBeanService getService(){
              return new ApplicationBeansService(env);
          }
      }
      

      然后在服务构造函数中

      @Service
      public class ApplicationBeansService implements IApplicationBeanService {
      ...
         public ApplicationBeansService(Environment env){
            ...
            String value = env.getProperty("your.value")
            ...
         }
      ...
      }
      

      不要忘记填写您的 application.properties:

      your.value = some-string-value
      

      【讨论】:

        【解决方案8】:

        正如上面第二个答案中所提供的,我确实使用了 spring boot,因此删除了 static 关键字并解决了我的问题。确保您没有使用 @Value 定义的属性的静态属性。

        【讨论】:

          【解决方案9】:

          您可以尝试使用@PropertySource 并为其提供属性文件的路径,您可以在下面找到示例:

          @Component
          @PropertySource("classpath:application.properties")
          public class EntityManager {
          
              @Value("${language}")
              private static String newLang;
          
              public EntityManager(){
                  System.out.println("langauge is: " + newLang);
              }
          }
          

          【讨论】:

            【解决方案10】:

            在我的例子中,同样的问题有一个稍微不同的原因 - 我有一个带有静态实例变量的类(我们用来实现单例模式的旧常用方法),我想从应用程序中注入一个条目。属性(可能是“静态”的事情是为什么找不到该属性 - 没有错误,没有任何东西:/)。

            此外,该类与声明为@SpringBootApplication 的类位于完全不同的包中。我知道在 Spring Boot 和自动组件扫描中必须认真考虑包名称和位置。我的 5 美分

            【讨论】:

              【解决方案11】:

              如果您在 Spring Bean 完全初始化之前尝试读取属性文件中的值,则始终为 null,例如,在从构造函数调用值时。我就是这种情况。

              要解决这个问题,请像这样使用@PostConstruct 注释:

              @Configuration
              public class CustomConfiguration {
              
              
                   Logger logger = Logger.getLogger(CustomConfiguration.class.getSimpleName());
              
                   @Value("${test.value}")
                   private String testValue;
              
                    @PostConstruct
                    public void initializeApplication() {
                      logger.info("============================================>"+testValue);
                    }
              

              在调用initializeApplication 之前,请确保您没有尝试在其他任何地方使用testValue 的值。

              【讨论】:

                猜你喜欢
                • 2018-09-15
                • 2020-06-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-05-20
                • 1970-01-01
                • 1970-01-01
                • 2016-12-13
                相关资源
                最近更新 更多