SpringBootApplication无法从application.yml文件加载属性

时间:2017-09-16 08:18:50

标签: java spring spring-boot yaml

配置类,

@Configuration
public class SpringContext {
@Bean
public BlockingQueue<String> queue(@Value("${queue.size}") int queueSize) {
    return new LinkedBlockingQueue<>();
   }
}

主要课程,

@SpringBootApplication
public class SpringContextTest {

    public static void main(String[] args) {
        final SpringApplication springApplication = new SpringApplication(SpringContext.class);
        springApplication.setWebEnvironment(false);
        springApplication.run();
        System.out.println("queue.size" + System.getProperty("queue.size"));
    }

}

application.yml,

queue.size: 10

启动主类时,我收到以下错误,

Caused by: java.lang.NumberFormatException: For input string: "${queue.size}"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_144]

我错过了一些注释?在我的理解中,我使用了Spring启动应用程序所需的最小注释。 我看过一些类似的帖子,但没有帮助。也 尝试使用 - spring.config.location

My Spring入门版: 1.3.6.RELEASE

3 个答案:

答案 0 :(得分:3)

您的配置文件看起来更像application.properties而不是application.yml

queue.size: 10

等效yml应为:

queue:
    size: 10

<强>更新

是的,两者都适用于.yml你是对的。我完全复制了你的例子并且它有效!

确保application.yml文件位于src/main/resources/的根目录中。当我在子目录中有application.yml文件时,我遇到了与您相同的错误,例如src/main/resources/com/myapp/

答案 1 :(得分:1)

Spring Boot文档的Externalized Configuration部分,解释了您可能需要的所有细节。

根据你的例子来加载主类中的属性,你可以做这样的事情,

  1. 首先仔细检查yaml文件的位置,它应该位于/src/main/resources/application.yaml
  2. 内容应如下例所示,

    app:
        value1: 12
        value2: stringValue
    
  3. 示例代码,

    package com.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.core.env.Environment;
    
    @SpringBootApplication
    public class App {
    
    
    public static void main( String[] args ){
        SpringApplication app = new SpringApplication(App.class);
        Environment env = app.run(args).getEnvironment();
    
        String value1 = env.getProperty("app.value1");
        String value2 = env.getProperty("app.value2");
    
        System.out.println("---------------- "+value1);
        System.out.println("---------------- "+value2);
    
    }
    
    }

答案 2 :(得分:1)

猜测

根据您提供的当前信息,我无法重新产生问题,因此以下只是一些猜测:

  • 检查application.yml的文件名和文件位置是否正确;
  • 尝试使用Spring EL:

    @Value("#{applicationConfig['queue.size']}")
    
  • 尝试调试属性加载:

    @Bean
    public BlockingQueue<String> queue(ConfigurableEnvironment env) {
      return new LinkedBlockingQueue<>(); // set breakpoint here, to see if env has your property in PropertySource: applicationConfig
    }
    

更多

我的博客中有关property source and yaml loading的更多信息。

另外

如果建议无效,您可能会更好

  • 提供可以重新产生问题的示例项目;
  • 提供完整的堆栈跟踪;