我遇到类似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文件的作者更具描述性的标识符名称。
答案 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
// ...
}