Java Spring配置属性递归类型
我试图创建一个配置属性类,它有一个递归类,结构类似于链表。我使用的是SpringBoot2.0.6.RELEASE,该类是使用Java Spring配置属性递归类型,java,spring,spring-boot,Java,Spring,Spring Boot,我试图创建一个配置属性类,它有一个递归类,结构类似于链表。我使用的是SpringBoot2.0.6.RELEASE,该类是使用@EnableConfigurationProperties({EnginealConfig.class})自动连接的 我遇到的问题是,只有一个第一级绑定到测试对象,x.Test永远不会被设置 使用以下application.properties文件: engineal.x.value: "Test1" engineal.x.test.value: "Test2" eng
@EnableConfigurationProperties({EnginealConfig.class})
自动连接的
我遇到的问题是,只有一个第一级绑定到测试对象,x.Test
永远不会被设置
使用以下application.properties文件:
engineal.x.value: "Test1"
engineal.x.test.value: "Test2"
engineal.x.test.test.value: "Test3"
以及以下配置属性类:
@ConfigurationProperties(prefix = "engineal")
public class EnginealConfig {
static class Test {
private String value;
private Test test;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Test getTest() {
return test;
}
public void setTest(Test test) {
this.test = test;
}
@Override
public String toString() {
return "Test{" +
"value='" + value + '\'' +
", test=" + test +
'}';
}
}
private Test x;
public Test getX() {
return x;
}
public void setX(Test x) {
this.x = x;
}
@Override
public String toString() {
return "EnginealConfig{" +
"x=" + x +
'}';
}
}
对象将打印EnginealConfig{x=Test{value='Test1',Test=null}
。不幸的是,递归不起作用
在尝试了不同的方法来实现这一点之后,我尝试了将EnginealConfig#Test.Test从private-Test-Test代码>到私有列表测试代码>,以及getter和setter。然后,通过将列表与一个元素一起使用,这种递归可以工作
以下application.properties与列表一起更改:
engineal.x.value: "Test1"
engineal.x.test[0].value: "Test2"
engineal.x.test[0].test[0].value: "Test3"
将输出EnginealConfig{x=Test{value='Test1',Test=[Test{value='Test2',Test=[Test{value='Test3',Test=null}]}
。然后,我可以使用test.get(0)
访问下一个元素
因此,似乎只有当递归类型在集合中时才支持递归
虽然这个解决方法还可以,但我更愿意使用我的第一种方法。是否支持递归类而不需要集合?谢谢你的帮助
@ConfigurationProperties(prefix = "engineal")
public class EnginealConfig {
static class Test {
//@NestedConfigurationProperty
private String value;
@NestedConfigurationProperty
private Test test;
您可以使用@NestedConfigurationProperty
注释对字段进行注释。只需将内部类设置为一个单独的类,那么一切都会正常工作
application.yml
simple:
value: aa
myTest:
value: lower
配置类
@ConfigurationProperties(prefix = "simple")
@Data //It is for getter setter
public class SimpleConfig {
private String value;
private MyTest myTest;
}
递归类
@Data
public class MyTest {
private String value;
private MyTest myTest;
}
测试用例
@Resource
private SimpleConfig simpleConfig;
@Test
public void myTest(){
String value = simpleConfig.getValue();
System.out.println("outerValue : " + value);
String innerValue = simpleConfig.getMyTest().getValue();
System.out.println("innerValue :" + innerValue);
}
结果
outerValue : aa
innerValue :lower
不幸的是,这个答案并不能解决问题。将@NestedConfigurationProperty
添加到字段EnginealConfig#Test.Test
仍然会导致相同的精确配置:EnginealConfig{x=Test{value='Test1',Test=null}
实际上声明“此注释与实际绑定过程没有任何关系”在文档中:我相信这可以通过使用自定义转换器(/w@ConfigurationPropertiesBinding
)来解决,但是SpringBoot 2.x目前忽略了带注释的对象,这里有一个相关的问题:可以帮助您,似乎您需要spring configuration metadata.json
。不过,感谢您的评论@luisumñoz,根据那篇文章,spring-configuration-metadata.json似乎只在IDE中提供自动完成功能;并且不会影响实际的配置绑定,这就是我的问题所在。说到这里,spring引导配置处理器抛出了一个StackOverflowException和我提供的示例类,因此很明显它也无法处理这个递归结构。值得向spring报告一个错误!但请注意,这仅适用于第一层。如果您添加另一层(即:simple.myTest.myTest.value,因此实际上会有一个递归),Spring将检测递归并为其分配“null”。那么“分配null”并不是正确的说法,但我想你知道我的意思。是的,我刚刚试过。就像你说的。但我想我找到了一种方法,重写一些东西