Java Spring配置属性递归类型

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

我试图创建一个配置属性类,它有一个递归类,结构类似于链表。我使用的是SpringBoot2.0.6.RELEASE,该类是使用
@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”并不是正确的说法,但我想你知道我的意思。是的,我刚刚试过。就像你说的。但我想我找到了一种方法,重写一些东西