将YAML列表映射到Spring Boot中的对象列表

时间:2016-03-26 05:59:00

标签: java spring spring-boot configuration yaml

我遇到类似Mapping list in Yaml to list of objects in Spring Boot中描述的问题,除了我想从YAML中使用的相应键名改变我对象中至少一个字段的标识符。

例如:

YAML文件:

config:
    gateways:
        -
            id: 'g0'
            nbrInputs: 128
            nbrOutputs: 128
        -
            id: 'g1'
            nbrInputs: 128
            nbrOutputs: 128

配置类:

@Configuration
@ConfigurationProperties(prefix="config")
public class GatewayConfig
{
    List<Gateway> gateways = new ArrayList<Gateway>();

    // Getter/Setter for gateways
    // ...

    public static class Gateway
    {
        private String id;

        @Value("${nbrInputs}")
        private int numInputs;

        @Value("${nbrOutputs}")
        private int numOutputs;

        // Getters and Setters
        // ...
    }
}

我希望@Value注释允许我注入相应的属性值,但这似乎不起作用(注入'id'字段似乎工作正常)。

有没有办法用@Value(或任何其他注释)来做到这一点?

谢谢。

修改 请注意,我希望确定是否可以强制YAML属性与内部POJO 中的字段之间的对应关系,而不更改的名称。我可能想要这样做有几个原因 - 例如我可能无法控制YAML文件的格式,我想在我的POJO中使用比YAML文件的作者更具描述性的标识符名称。

1 个答案:

答案 0 :(得分:8)

正如Stephave Nicoll所说,@Value注释与@ConfigurationProperties无关。只需在内部POJO中命名与配置文件中相同的字段,这应该有效:

@Configuration
@ConfigurationProperties(prefix="config")
@EnableConfigurationProperties
public class GatewayConfig
{
    List<Gateway> gateways = new ArrayList<Gateway>();

    // Getter/Setter for gateways
    // ...

    public static class Gateway
    {
        private String id;
        private int nbrInputs;
        private int nbrOutputs;

        // Getters and Setters
        // ...
    }
}

评论反应:

使用普通的Spring / Spring Boot,我认为您不能映射具有不同名称的字段并将其加载到网关列表中。可以选择使用普通的@Value注释,但您的网关数量需要硬编码:

@Component
public class Gateway0{
    @Value("${config.gateways[0].id}")
    private String id;

    @Value("${config.gateways[0].nbrInputs}")
    private int numInputs;

    @Value("${config.gateways[0].nbrOutputs}")
    private int numOutputs;

    // Getters and Setters
    // ...
}