Spring框架中的YAML列表(不带springboot)

pnwntuvh  于 2022-11-21  发布在  Spring
关注(0)|答案(1)|浏览(134)

注意:没有SpringBoot。只有Spring框架。

我在springboot项目中看到了@ConfigurationProperties可以使用,但是在spring framework项目中却无法使用@Value,看起来@Value注解无法正确解析列表。
下面是一个示例项目:https://github.com/KiranMohan/spring-yaml
为了加载yaml文件,我使用了YamlPropertiesFactoryBean
代码在junit ExampleTest类中进行了测试。
输出

log.debug("myList: {}",example.getMyList());


调试[main] org.ktest.示例测试:我的列表:[${示例.我的列表}]
示例yaml:

example:
  enabled: true
  name: "org.ktest"
  myArray: >
    abc,
    def

  myList:
    - "ghi"
    - "jkl"

示例代码:

@Configuration
@PropertySource(value = "classpath:example.yml", factory = YamlPropertySourceFactory.class)
public class Example {

    @Value("${example.enabled}")
    private boolean enabled;
    @Value("${example.name}")
    private String name;
    @Value("${example.myArray}")
    private String[] myArray;
    @Value("${example.myList}")
    private List<String> myList;
0yg35tkg

0yg35tkg1#

您的YamlPropertySourceFactory使用YamlPropertiesFactoryBean,其Javadoc声明
列表被拆分为具有[]解除引用器的属性键,例如以下YAML:

servers:
 - dev.bar.com
 - foo.bar.com.

会变成这样的属性:

servers[0]=dev.bar.com  
servers[1]=foo.bar.com

这也在这里的Spring文档中提到。
换句话说,使用这些类型,您不能通过属性解析将example.myList YAML元素输入List

@Value("${example.myList[0]}")
private String myListFirstElement;

Spring文档也提到了这一点。
可以使用Sping Boot 的Binder类将使用[index]表示法的属性绑定到Java ListSet对象。
您可以尝试查看该类是如何执行此操作的,并在您自己的代码中重现它。

相关问题