在 SpringBoot 中将 yaml 映射到对象 hashmap
Posted
技术标签:
【中文标题】在 SpringBoot 中将 yaml 映射到对象 hashmap【英文标题】:Map yaml to object hashmap in SpringBoot 【发布时间】:2017-09-16 07:23:55 【问题描述】:我正在尝试在我的 Spring Boot 应用程序中将 yml 文件映射到具有 String Key 和 PromotionPolicy 值的 HashMap,并使用默认的 Spring Boot 实现来解析这些值,但 PromotionPolicy 对象仅包含默认值 [0, false , false] 适用于我尝试从 Map 读取值时的所有实例。
我的 yml 是:
promotionPolicies :
policies:
P001NN:
PromotionPolicy:
expiryPeriodInDays: 16
reusable: true
resetExpiry: false
P001YN:
PromotionPolicy:
expiryPeriodInDays:1
reusable:true
resetExpiry:false
P001NY:
PromotionPolicy:
expiryPeriodInDays:1
reusable:false
resetExpiry:true
我的模型是:
public class PromotionPolicy
private int expiryPeriodInDays;
private boolean reusable;
private boolean resetExpiry;
public int getExpiryPeriodInDays()
return expiryPeriodInDays;
public void setExpiryPeriodInDays(int expiryPeriodInDays)
this.expiryPeriodInDays = expiryPeriodInDays;
public boolean isReusable()
return reusable;
public void setReusable(boolean reusable)
this.reusable = reusable;
public boolean isResetExpiry()
return resetExpiry;
public void setResetExpiry(boolean resetExpiry)
this.resetExpiry = resetExpiry;
组件java类如下:
@Configuration
@ConfigurationProperties(prefix = "promotionPolicies")
@EnableConfigurationProperties
@Component
public class PromotionPolicyConfig
private Map<String, PromotionPolicy> policies = new HashMap<String, PromotionPolicy>();
public void setPolicies(Map<String, PromotionPolicy> policies)
this.policies = policies;
public Map<String, PromotionPolicy> getPolicies()
return policies;
尝试在此处显示值:
@RestController
@RequestMapping("/test")
public class LoyaltyServiceController
@Autowired
PromotionPolicyConfig promotionPolicyConfig;
@RequestMapping(value = "/try")
public String tryThis()
for (Entry<String, PromotionPolicy> entry : promotionPolicyConfig.getPolicies().entrySet())
System.out.print(entry.getKey() + " : ");
System.out.print(entry.getValue() + " : ");
System.out.print(entry.getValue().getExpiryPeriodInDays() + " : ");
System.out.print(entry.getValue().isResetExpiry() + " : ");
System.out.println(entry.getValue().isReusable() + " : ");
我的输出如下:
P001NN : com.expedia.www.host.loyalty.model.PromotionPolicy@63a1c99b : 0 : false : false :
P001YN : com.expedia.www.host.loyalty.model.PromotionPolicy@7892b6b6 : 0 : false : false :
P001NY : com.expedia.www.host.loyalty.model.PromotionPolicy@459928ab : 0 : false : false :
虽然我希望结果包含我的 yml 中的值。 我还尝试在我的 yml 中删除“PromotionPolicy:”行,但没有运气。
请求帮助了解如何将 yml 映射到自定义对象的 Map 中。
【问题讨论】:
这可能会有所帮助***.com/questions/32593014/… 【参考方案1】:把你的 yml 改成
promotionPolicies :
policies:
P001NN:
expiryPeriodInDays: 16
reusable: true
resetExpiry: false
P001YN:
expiryPeriodInDays: 1
reusable: true
resetExpiry: false
P001NY:
expiryPeriodInDays: 1
reusable: false
resetExpiry: true
【讨论】:
正如我在描述中提到的,我试过了,但没有运气。它仍然具有相同的默认值 0、false、false。 早期yml的问题是空格,下面的YML工作正常。 @Manjunath 那么请将此标记为答案:)【参考方案2】:问题出在空格上,下面的 yml 可以正常工作。文本和:后面的空格是必需的
promotionPolicies :
policies :
P001NN :
PromotionPolicy :
expiryPeriodInDays: 16
reusable: true
resetExpiry: false
P001YN :
PromotionPolicy :
expiryPeriodInDays:1
reusable:true
resetExpiry:false
P001NY :
PromotionPolicy :
expiryPeriodInDays:1
reusable:false
resetExpiry:true
【讨论】:
这不太可能是问题的原因。【参考方案3】: 这对我有用YML:
property-name: '
key1: "value1",
key2: "value2"
'
春季启动:
@Value("#$property-name")
private Map<String,String> myMap;
感谢:https://relentlesscoding.com/2018/09/09/spring-basics-dynamically-inject-values-with-springs-value/
【讨论】:
【参考方案4】: promotionPolicies :
policies:
P001NN:
expiryPeriodInDays: 16
reusable: true
resetExpiry: false
P001YN:
expiryPeriodInDays: 1
reusable: true
resetExpiry: false
P001NY:
expiryPeriodInDays: 1
reusable: false
resetExpiry: true
Java 代码:
//Used lambok and spring annotation
@Data
@Configuration
@ConfigurationProperties(prefix = "promotionPolicies")
@NoArgsConstructor
@AllArgsConstructor
public class PromotionPolicies
private Map<String, Map<String, String>> policies = new HashMap<>();
【讨论】:
以上是关于在 SpringBoot 中将 yaml 映射到对象 hashmap的主要内容,如果未能解决你的问题,请参考以下文章
将 Yaml 中的列表映射到 Spring Boot 中的对象列表