在 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 中的对象列表

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

Springboot 无法将属性文件映射到变量

springboot配置静态资源映射

springboot配置静态资源映射

SpringBoot-SpringData