从application.properties Spring Boot读取值

时间:2017-08-01 04:08:32

标签: java spring spring-mvc

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

  • SRC
      • 的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

我有一个类需要使用该语言= java属性。这就是我试图使用它的方式:

public class EntityManager {

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

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

由于某种原因,打印的值总是" null" !我也尝试将它放在类声明之上:

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

11 个答案:

答案 0 :(得分:11)

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

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

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

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

}

OR

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

    @Autowired
    private Environment env;

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

}

答案 1 :(得分:5)

如果您使用Spring启动,如果您使用的是Spring启动程序父启动,则不需要@PropertySource("classpath:application.properties"),只需删除static关键字即可开始工作。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

在类

之上缺少构造型注释
@Component
public class EntityManager {

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

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

答案 4 :(得分:1)

好吧我用绝望的行为弄清楚了。我添加了

@PropertySource("classpath:application.properties") 

属性但由于某种原因它仍然没有工作。

然后我删除了"静态"修饰符,它工作!

我不确定为什么没有"静态"在那里,但确实如此。如果可以向我解释这将是非常好的,因为这一切都令人困惑。

答案 5 :(得分:1)

创建你的豆

@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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

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

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

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

在我的情况下,同一问题的原因稍有不同-我有一个带有静态实例变量的类(我们以前用来实现Singleton模式的惯常方法),我想从应用程序注入一个条目。属性(可能是“静态”的原因是找不到属性的原因-没有错误,没有任何问题:/)。

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

答案 10 :(得分:0)

如果您在 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);
      }

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