我需要一个Spring Boot应用程序来加载一些最适合小型电子表格的配置。几乎所有的配置都由绑定到@ConfigurationProperties
POJO的YAML属性文件组成,因此:
static class Entry {
private final Terrain terrain; // A simple enumeration
private final int value;
// ... other fields
public Entry(Terrain terrain, int value, ...) { ... }
}
@ConfigurationProperties("section")
@ConstructorBinding
@Validated
class SectionProperties {
private final List<Entry> entries;
public SectionProperties(List<Entry> entries) {
this.entries= List.copyOf(entries);
}
// ... other fields, getters, etc
}
如果YAML的结构是这样的一系列对象,这就很好了:
section:
entries:
- terrain: plains
value: 1
- terrain: forest
value: 2
然而,从该配置的用户/作者的角度来看,如果数据被组织为"电子表格",那将是非常好的,因为他们将能够在彼此的上下文中看到各种值,而不是上面的大列表(大约有十几个条目(。类似这样的东西:
section:
entries:
- [plains, 1]
- [forest, 2]
这是有效的YAML(据我所知(,但配置绑定失败了,列表中的每个条目都出现了"未绑定属性"错误,即它似乎将entries
识别为YAML序列,但无法将YAML序列块(方括号(中的数据绑定到Entry
。
有人试图这样做或做类似的事情吗?有可能吗?
很抱歉,如果其他地方已经解决了这个问题,我已经搜索了SO和Spring文档,但找不到任何涵盖这个特定案例的内容,也找不到它是否真的可行。
如果您自己实现映射,这应该是可能的:
@Component
@ConfigurationPropertiesBinding
public class EntryConverter implements Converter<List<String>, Entry> {
@Autowired
private ConversionService conversionService;
@Override
public Entry convert(List<String> from) {
String[] data = from.split(",");
return new Entry(data[0],
conversionService.convert(data[1], Integer.class), ...);
}
}
我不确定这是否适用于嵌套在列表中的非标量值,也不确定它是否适用于List<Entry>
。尝试一下并报告:(。