YML讀取注意事項
使用YML時遇到的坑:
最近在做項目時,遇到了一些在讀取YML配置時發生的問題,在這里寫一並寫下來,希望給自己以及大家一個提示,能盡量避免在讀取配置文件時發生這些錯誤,給開發帶來不必要的多余時間去處理。
多重層級讀取
在YML中我們再添加一個ZZP2的配置信息,其中包含了girl節點以及girl下的name,age屬性。
zzp2: name: 西科啦啦 age: 30 height: 175cm weight: 760kg long: 10cm girl: name: Marry.Jean age: 18
和之前一樣,我們controller中通過@Value注解來獲取屬性值,同時創建一個url來輸出我們的屬性值。
@Value("${zzp2.name}") private String name2; @Value("${zzp2.girl.age}") private Integer girlAge; @Value("${zzp2.girl.name}") private String girlName; @RequestMapping(value = "/getZzpGirlInfo",method = RequestMethod.GET) public String getZzpGirlInfo(){ return "zzp2.name:" + name2 + "\n" + "zzp2.girl.age:" + girlAge + "\n" + "zzp2.girl.name:" + girlName; }
接下來我們通過POSTMAN來訪問下,可以看到使用注解@Value沒有問題,都可以渠道屬性值。
接下來我們按照之前的思路建立一個Zzp2properties來將配置文件轉變為一個實體類進行接收,這個時候問題就來了,我們如何定義girl這個屬性呢,我們之前說過,配置文件與實體類的映射是根據屬性名一致來相互對應的,可是我們無法命名一個屬性為girl.name啊。我想聰明的你應該已經想到了,是的,我們再建立一個實體類Girl來接收girl的參數,其中的屬性也是與girl下的參數一一對應。
public class Girl { private String name; private String age; //get set 方法... }
@Component @ConfigurationProperties(value = "zzp2") public class Zzp2Properties { private String name; private String height; private String weight; private Integer age; private Girl girl; @Override public String toString() { return "Zzp2Properties{" + "name='" + name + '\'' + ", height='" + height + '\'' + ", weight='" + weight + '\'' + ", age=" + age + ", girl=" + girl + '}'; } //get set方法...
之后我們再在controller中測試一下
@Autowired private Zzp2Properties zzp2Properties; @RequestMapping(value = "/getZzpGirlInfo2",method = RequestMethod.GET) public Zzp2Properties getZzpGirlInfo2(){ return zzp2Properties; }
可以發現,girl的參數已經被注入進來,可以正常獲得了,這里要特別說明的是在ZzpProperties中的屬性Girl命名一定是girl,必須要與配置文件中的保持一致。
static靜態屬性
在一般開發中,我們經常會做靜態屬性或是靜態塊的方法來給我們的config使用,比如我使用jedis時,config中就是使用靜態塊來創建鏈接,那在YML中能否將配置信息讀進static中呢?很可惜,答案是否定的。
我們首先在application.yml中增加zzp3的配置信息。
zzp3: name: 北坡卡卡 age: 10 height: 105cm weight: 30kg
然后在controller中通過設置靜態屬性來獲取配置信息。
@Value("${zzp3.name}") private static String name3; @Value("${zzp3.age}") private static Integer age3; @Value("${zzp3.height}") private static String height3; @RequestMapping(value = "/getZzp3Info",method = RequestMethod.GET) public String getZzp3Info(){ return "zzp3.name:" + name3 + "\n" + "zzp3.age:" + age3 + "\n" + "zzp3.name:" + name3; }
通過POSTMAN的測試,我們發想,屬性值都是null,無法得到配置文件參數。
那是不是我們就無法使用static來獲取配置信息來呢?其實並不然,我們可以使用static屬性的set方法來獲取,我們添加三個參數的set方法,並吧set方法中的static給去掉,同時吧直接@Value置於set方法上。
private static String name3; private static Integer age3; private static String height3; @Value("${zzp3.name}") public void setName3(String name3) { Round2Controller.name3 = name3; } @Value("${zzp3.age}") public void setAge3(Integer age3) { Round2Controller.age3 = age3; } @Value("${zzp3.height}") public void setHeight3(String height3) { Round2Controller.height3 = height3; }
我們仍舊通過POSTMAN來訪問看下結果,我們發現已經可以獲取到值了。
開發環境切換
上次我們說到切換開發環境,但並沒有演示,我們這次來試一下,創建application-dev.yml其中將zzp3的配置信息更換下,然后在application.yml中指定使用dev的參數給項目使用。
#application-dev.yml zzp3: name: 西莫納納 age: 99 height: 95cm weight: 90kg #application.yml spring: profiles: active: dev
我們通過POSTMAN可以發現,zzp3的信息已經是使用的dev的參數了。