java - Spring 配置属性递归类型

标签 java spring spring-boot

我正在尝试创建一个具有递归类的配置属性类,其结构类似于链表。我正在使用 Spring boot 2.0.6.RELEASE,并且正在使用 @EnableConfigurationProperties({EnginealConfig.class}) Autowiring 该类.

我遇到的问题是只有一个第一级将绑定(bind)到 Test 对象 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; 更改为至private List<Test> test; ,以及 getter 和 setter。然后通过使用一个元素的列表,这个递归就起作用了。

以下带有 List<Test> 的 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) 访问下一个元素.

因此,似乎只有当递归类型在集合中时才支持递归。

虽然这种解决方法没问题,但我更愿意使用我的第一种方法。是否/应该在不需要集合的情况下支持递归类?感谢您的帮助!

最佳答案

只需将您的内部类设置为单独的类,然后一切都会正常工作。

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

关于java - Spring 配置属性递归类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52906556/

相关文章:

Java 表 - AWT

spring - 所需的请求部分 'file' 不存在 - Angular2 发布请求

java - 防止 Spring Boot 将日志打印到控制台

java - 将@RequestBody从node js发送到Spring Boot Rest API

postgresql - 无法从 wsl 2 上运行的服务之一连接到 wsl 2 上的容器中运行的 postgres 数据库

java - Android 目标 API - 无法创建带有 Activity 的项目

java - 尽管在另一个线程中,代码仍会抛出 NetworkOnMainThread 异常

java - 将 JPanelForm 类转换为 JFrameForm 类

spring - Spring Boot编译的jar文件在哪里

java - 使用Spring MVC创建注解设置@RequestMapping参数