web-dev-qa-db-ja.com

Spring Bootでyamlをオブジェクトハッシュマップにマップする

Springブートアプリケーションでymlファイルを文字列キーとPromotionPolicy値を含むHashMapにマップし、デフォルトのSpringブート実装を使用して値を解析しようとしていますが、PromotionPolicyオブジェクトにはデフォルト値[0、false、false]のみが含まれていますマップから値を読み取ろうとするすべての場合。

私の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をカスタムオブジェクトのマップにマップする方法を理解するためのヘルプをリクエストしてください。

5
Manjunath

ymlを

promotionPolicies : 
  policies: 
    P001NN:
            expiryPeriodInDays: 16
            reusable: true
            resetExpiry: false
    P001YN:
            expiryPeriodInDays: 1
            reusable: true
            resetExpiry: false
    P001NY:
            expiryPeriodInDays: 1
            reusable: false
            resetExpiry: true
11
pvpkiran
  • これは私のために働いた

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/

3
csf

問題はスペースでした、以下の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
1
Manjunath