首页 > 解决方案 > 如何从 application.yml 文件中注入属性?

问题描述

我有一些 application.yml 文件:

main-prop:
  sub-prop:
    name: test
    password: test1

    data:
      prop1: 1
      prop2: 0

和类:

abstract class abscractPropertyHolder {
    private String namePattern;
    private String categoryPattern;
    private String departmentPattern;
    private Data data;
}

@Component
@ConfigurationProperties("main-prop")
class ReconfigurationEventFilterConfig extends abscractPropertyHolder {
}

@Data
@Accessors(chain = true)
class Data {   // if my class is public - my app run successfully, otherwise fail to start (exception).
    private int prop1;
    private int prop2;

    static DatanewInstanceWithDefaultParameters() {
        return new Data().setProp1(1).setProp2(0);
    }
}

我有这个例外:

Could not instantiate property type [com.test.Data] to auto-grow nested property path; 
nested exception is org.springframework.beans.BeanInstantiationException: 
Failed to instantiate [com.test.Data]: Is the constructor accessible?;
nested exception is java.lang.IllegalAccessException: 
Class org.springframework.beans.BeanUtils can not access a member of class 
com.test.Data with modifiers "public"

所有课程都放在一个包中。我不想公开我的数据类。如何从 application.yml 注入数据?

标签: javaspringspring-bootlombok

解决方案


我解决了这样的问题:

@Autowired在 abscactPropertyHolder 类中添加了 spring 注释@ConfigurationProperties("main-prop.sub-prop.data"),并在 Data 类中添加了 spring 注释。

abstract class abscractPropertyHolder {
    private String namePattern;
    private String categoryPattern;
    private String departmentPattern;
    @Autowired
    private Data data;
}

@Data
@Accessors(chain = true)
@ConfigurationProperties("main-prop.sub-prop.data")
class Data {   // if my class is public - my app run successfully, otherwise fail to 
start (exception).
    private int prop1;
    private int prop2;

    static DatanewInstanceWithDefaultParameters() {
        return new Data().setProp1(1).setProp2(0);
    }
}

推荐阅读