【问题标题】:How to inject properties from application.yml file?如何从 application.yml 文件中注入属性?
【发布时间】:2019-02-04 13:12:04
【问题描述】:

我有一些 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 注入数据?

【问题讨论】:

  • 公开课程有什么问题?春天的一切最终都变成了豆子,所以无论如何它都可以访问。
  • @maslan 这是类只能使用一个包,我不想公开它。
  • 然后在您的字段上使用 @Value(PROPERTY_NAME) 注释,并制作不公开的 getter 和 setter

标签: java spring spring-boot lombok


【解决方案1】:

我解决了这样的问题:

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

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);
    }
}

【讨论】:

    【解决方案2】:

    像这样格式化yml:

    main-prop:
        sub-prop:
          name: test
          password: test1
    
          data:
            prop1: 1
            prop2: 0
    

    【讨论】:

      【解决方案3】:

      @Data 使用@RequiredArgsConstructor。尝试通过覆盖它创建的构造函数的可见性来定义 @Data 注释的行为:

      @RequiredArgsConstructor(access = AccessLevel.PUBLIC)
      

      拥有@Data@RequiredArgsConstructor,Lombok 将使用您定义的访问级别。

      要么这样,要么尝试定义一个@NoArgsConstructor

      【讨论】:

      • 我试试这个,但对我没有帮助,我得到了同样的例外。
      • @Oleg 您是否尝试过手动定义访问器/构造器而不是使用 Lombok?同时运行 delombok 来检查自动生成的代码。它可能不是 Spring 预期的格式
      • 我从 Data 类中删除了 Lombok 注释,但它没有效果。我得到了同样的例外。
      • 您删除了注释,但为了确保您是否手动创建了 getter 和 setter?
      • 是的,我是手工制作的 getter/setter 和构造函数。
      猜你喜欢
      • 2019-02-04
      • 2018-01-04
      • 2018-08-25
      • 2016-10-16
      • 2020-01-22
      • 2020-01-30
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多