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をカスタムオブジェクトのマップにマップする方法を理解するためのヘルプをリクエストしてください。
ymlを
promotionPolicies :
policies:
P001NN:
expiryPeriodInDays: 16
reusable: true
resetExpiry: false
P001YN:
expiryPeriodInDays: 1
reusable: true
resetExpiry: false
P001NY:
expiryPeriodInDays: 1
reusable: false
resetExpiry: true
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/
問題はスペースでした、以下の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