在Micronaut中如何正确读取配置文件中的对象数组属性?
解决Micronaut中@ConfigurationProperties绑定对象数组属性为null的问题
嘿,我看你遇到了Micronaut配置绑定的典型问题——能识别出objarray里有2个元素,但每个元素的env和label都是null。这其实是因为Micronaut的配置绑定机制默认依赖JavaBean规范,你的内部类字段没有提供合适的访问方式,导致绑定器没法给这些字段赋值。
下面给你几种可行的解决方案,选哪种看你的项目风格:
方案1:给字段添加Getter/Setter方法(标准JavaBean方式)
这是最通用的做法,Micronaut会自动识别这些方法来完成属性注入:
@ConfigurationProperties("myconf") static class MyConf { private String uri; private List<ArrayElement> objarray; // 为uri添加Getter和Setter public String getUri() { return uri; } public void setUri(String uri) { this.uri = uri; } // 为objarray添加Getter和Setter public List<ArrayElement> getObjarray() { return objarray; } public void setObjarray(List<ArrayElement> objarray) { this.objarray = objarray; } static class ArrayElement { private List<String> env; private String label; // 为env添加Getter和Setter public List<String> getEnv() { return env; } public void setEnv(List<String> env) { this.env = env; } // 为label添加Getter和Setter public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } } }
方案2:直接使用Public字段
如果不想写一堆Getter/Setter,可以把字段设为public,Micronaut也能直接绑定这些字段:
@ConfigurationProperties("myconf") static class MyConf { public String uri; public List<ArrayElement> objarray; static class ArrayElement { public List<String> env; public String label; } }
方案3:用Java 16+的Record类(简洁推荐)
如果你的项目用的是Java 16或更高版本,用record来定义配置类会非常简洁——record会自动生成访问方法(虽然是env()而不是getEnv(),但Micronaut完全兼容这种方式):
@ConfigurationProperties("myconf") static record MyConf(String uri, List<ArrayElement> objarray) { static record ArrayElement(List<String> env, String label) {} }
随便选一种方式改造你的代码,就能让objarray里的每个元素都正确读取yml配置中的env和label值啦。
内容的提问来源于stack exchange,提问作者Typhoon
相关产品推荐
相关产品推荐

