如何从 application.yml 文件注入属性?
How to inject properties from application.yml file?
我有一些 application.yml 文件:
main-prop:
sub-prop:
name: test
password: test1
data:
prop1: 1
prop2: 0
和class是:
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"
所有 classes 地方都在一个包中。我不想让我的数据 class public。如何从 application.yml 注入数据?
像这样格式化yml:
main-prop:
sub-prop:
name: test
password: test1
data:
prop1: 1
prop2: 0
@Data
利用了 @RequiredArgsConstructor
。尝试通过覆盖它创建的构造函数的可见性来定义 @Data
注释的行为:
@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
具有 @Data
和 @RequiredArgsConstructor
,Lombok 将使用您定义的访问级别。
要么这样,要么尝试定义一个 @NoArgsConstructor
。
我是这样解决问题的:
我添加了 spring 注释 @Autowired
到 abscractPropertyHolder class 并添加了 spring 注释 @ConfigurationProperties("main-prop.sub-prop.data")
到数据 class。
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);
}
}
我有一些 application.yml 文件:
main-prop:
sub-prop:
name: test
password: test1
data:
prop1: 1
prop2: 0
和class是:
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"
所有 classes 地方都在一个包中。我不想让我的数据 class public。如何从 application.yml 注入数据?
像这样格式化yml:
main-prop:
sub-prop:
name: test
password: test1
data:
prop1: 1
prop2: 0
@Data
利用了 @RequiredArgsConstructor
。尝试通过覆盖它创建的构造函数的可见性来定义 @Data
注释的行为:
@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
具有 @Data
和 @RequiredArgsConstructor
,Lombok 将使用您定义的访问级别。
要么这样,要么尝试定义一个 @NoArgsConstructor
。
我是这样解决问题的:
我添加了 spring 注释 @Autowired
到 abscractPropertyHolder class 并添加了 spring 注释 @ConfigurationProperties("main-prop.sub-prop.data")
到数据 class。
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);
}
}