SpringBoot 複雜配置資訊讀取

weixin_33912246發表於2018-11-19

前言

本文接上一篇部落格Spring Boot讀取配置檔案自定義資訊

以上場景適用於比較簡單的屬性檔案。然而,在實際工作中我們會需要這樣的配置:配置檔案的key中也包含有變數資訊。如下所示:

tran.subtype.交易子型別.id=xxx
tran.subtype.交易子型別.infoTableName=xxx
tran.subtype.交易子型別.msgTemplate=xxx
tran.subtype.交易子型別.receiverSASMap.欄位名=SAS結果對映值

這裡支援配置多種交易子型別,並分別指定id, infoTableName和msgTemplate屬性的值。此外,還有一個map型別的配置:receiverSASMap。該map用於配置SAS規則引擎返回結果和資料庫表欄位的對應關係。即在properties檔案的key中存在兩個變數:上圖中的交易子型別欄位名

實際的屬性檔案如下所示:

tran.subtype.toUser.id=0001
tran.subtype.toUser.infoTableName=Table1
tran.subtype.toUser.receiverSASMap.RETAILER_INFO=1,2
tran.subtype.toUser.receiverSASMap.BRANCH_INFO=2
tran.subtype.toUser.msgTemplate=ABCtoUser

tran.subtype.toPublic.id=0002
tran.subtype.toPublic.infoTableName=Table2
tran.subtype.toPublic.receiverSASMap.RETAILER_INFO=3,4
tran.subtype.toPublic.receiverSASMap.BRANCH_INFO=5
tran.subtype.toPublic.msgTemplate=DEFtoPublic

我們如何編寫可以承載此類資訊的bean呢?

Bean的編寫

@Component
@ConfigurationProperties(prefix = "tran")
public class TranConfigBean {
    public static class Type {
        private String id;
        private String infoTableName;
        private String msgTemplate;
        private Map<String, String> receiverSASMap;

        // Setters and getters ...
    }

    private Map<String, Type> subtype;

    // Setters and getters.
}

這裡需要解釋下@ConfigurationProperties修飾的bean中map型別成員變數如何靈活運用。

複雜屬性匹配不容易理解的地方在於Map的變數名,key和value是怎麼對應到properties上的。對於value型別為簡單型別的map而言:

Map<String, String> demoMap;

對應的屬性檔案為:

# key1和key2會被對映為demoMap的key值
prefix.demoMap.key1=value1
prefix.demoMap.key2=value2

其中prefix@ConfigurationProperties中prefix的值。

如果Map中value的型別為複雜型別(bean, list或map):

Map<String, Student> demoMap;
// ...

public static class Student {
    private Integer id;
    private String name;
    // setters and getters
}

對應的屬性檔案為:

# key1和key2會被對映為demoMap的key值
prefix.demoMap.key1.id=001
prefix.demoMap.key1.name=paul
prefix.demoMap.key2.id=002
prefix.demoMap.key2.name=peter

總結

如果在properties檔案配置項的key中使用變數的話,需要在對應的bean內定義map。屬性檔案的書寫規則為:

prefix.mapName.keyN=valueN
字首.map名稱.keyN=valueN

相關文章