无法使用configurationproperties批注读取属性

时间:2018-07-22 22:03:05

标签: java spring spring-boot

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Application.class, args);
        GlobalProperties globalProperties = context.getBean(GlobalProperties.class);
        System.out.println(globalProperties);
    }
}

@Component
@PropertySource("classpath:global.yml")
@ConfigurationProperties("app")
public class GlobalProperties {

    private String error;
    private List<Menu> menus = new ArrayList<>();
    private Compiler compiler = new Compiler();

    public static class Menu {
        private String name;
        private String path;
        private String title;

    //getters and setters and tostring

    }

    public static class Compiler {
        private String timeout;
        private String outputFolder;

    //getters and setters and tostring
    }


    @Override
    public String toString() {
        return "GlobalProperties [error=" + error + ", menus=" + menus + ", compiler=" + compiler + "]";
    }


}
src / main / resources文件夹中的

global.yml文件

logging:
  level:
    org.springframework.web: ERROR
    com.mkyong: DEBUG
email: test@mkyong.com
thread-pool: 10
app:
  menus:
    - title: Home
      name: Home
      path: /
    - title: Login
      name: Login
      path: /login
  compiler:
    timeout: 5
    output-folder: /temp/
  error: /error/

当我运行应用程序时,我看不到正确读取global.yml属性。我得到这个作为o / p

GlobalProperties [error=null, menus=[], compiler=Compiler{timeout='null', outputFolder='null'}]

我是否错过了上面代码中的所有内容,无法从yml文件中读取属性。 我还尝试用global.properties替换global.yml,但这也行不通。

2 个答案:

答案 0 :(得分:0)

您必须像在嵌套静态类中一样,将setter添加到GlobalProperties类中。

答案 1 :(得分:0)

作为一般规则,具有局部变量的spring @component类需要为这些变量具有setter(并且getter也将是一个好习惯)。 spring使用no-args构造函数来制造bean和组件,并使用setter来初始化变量。 对于@component 3个子类型:@service@repository@controller当然也是如此。

如果要添加任何其他构造函数(也将覆盖默认情况下存在的“不可见”无参数构造函数),还请确保明确编写无参数构造函数。