Spring Boot 如何讓yml,properties配置文件有提示

我們在引用spring官方start庫或者第三方start庫時(shí)盛险,在寫配置文件時(shí)idea總是能精準(zhǔn)的提示,并且鼠標(biāo)可以點(diǎn)過去看具體屬性或者類,而自己寫的配置文件idea只會有“Cannot resolve configuration property ...”這樣的提示性湿。

我們現(xiàn)在也去配置我們自己的配置文件讓idea知道這些配置文件是干什么的。

一满败、需要的注解

  • @ConfigurationProperties 配置屬性文件肤频,需要指定前綴 prefix
  • @EnableConfigurationProperties 啟用配置,需要指定啟用的配置類
  • @NestedConfigurationProperty 當(dāng)一個(gè)類中引用了外部類算墨,需要在該屬性上加該注解

二宵荒、POM依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

三、配置類

@Data
public class School {
    private Integer no;
    private String name;
    private String address;
}
@Data
@ConfigurationProperties(prefix = "jiuxian")
public class JiuxianProperties {
    private String name;
    private String nameCn;
    private String nameEn;
    private String[] hobbies;
    private SexEnum sexEnum;
    private boolean single;
    private School school;
    private City city;

    enum SexEnum {
        MAN, WOMAN
    }

    @Data
    static class City {
        private String no;
        private String name;
    }
}

這個(gè)時(shí)候@ConfigurationProperties(prefix = "jiuxian") 注解會報(bào)錯(cuò)not registered via @EnableConfigurationProperties or marked as Spring component净嘀。這需要加上@EnableConfigurationProperties就可以了

@EnableConfigurationProperties({ JiuxianProperties.class })
@SpringBootApplication
public class SpringbootYmlApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootYmlApplication.class, args);
    }
}

四报咳、看效果

然后輸入 mvn clean package

這個(gè)時(shí)候properties和yml文件已經(jīng)可以提示了,不過有一些會有問題挖藏,比如jiuxian.school暑刃,這是一個(gè)對象,idea并不能解析,而因?yàn)镃ity對象是個(gè)內(nèi)部類是可以解析的膜眠。

如圖:
hint1.png
idea-warning1.png

如何處理呢岩臣?
只需要加上 @NestedConfigurationProperty注解即可

@NestedConfigurationProperty
private School school;

然后輸入命令 mvn clean package

警告消失(會有一點(diǎn)延遲)

五溜嗜、為什么

為什么一定要打包編譯后才可以呢?

看一下打包過后的結(jié)構(gòu)架谎,如圖:


classs1.png

idea之所以會代碼提示就是因?yàn)檫@個(gè)spring-configuration-metadata.json json文件炸宵。這個(gè)文件的生成依據(jù)的就是我們上面的配置。

六狐树、進(jìn)階配置

如果想在配置文件中能夠提示該字段描述焙压,以及該字段可選參數(shù),是否棄用等信息時(shí)抑钟,需要加額外的配置

1. 在resources目錄下新建META-INF文件夾涯曲,加一個(gè)additional-spring-configuration-metadata.json 配置文件

(1)該配置文件的節(jié)點(diǎn)信息

  • groups 有以下屬性:
    • name group的全名,該屬性必須
    • type group數(shù)據(jù)類型的類名在塔。例如幻件,如果group是基于一個(gè)被@ConfigurationProperties注解的類,該屬性將包含該類的全限定名蛔溃。如果基于一個(gè)@Bean方法绰沥,它將是該方法的返回類型。如果該類型未知贺待,則該屬性將被忽略
    • description 一個(gè)簡短的group描述徽曲,用于展示給用戶,要.點(diǎn)結(jié)尾麸塞。如果沒有可用描述秃臣,該屬性將被忽略
    • sourceType 來源類名。例如哪工,如果組基于一個(gè)被@ConfigurationProperties注解的@Bean方法奥此,該屬性將包含@Configuration類的全限定名,該類包含此方法雁比。如果來源類型未知稚虎,則該屬性將被忽略
    • sourceMethod 該組的方法的全名(包含括號及參數(shù)類型)。例如偎捎,被@ConfigurationProperties注解的@Bean方法名蠢终。如果源方法未知,該屬性將被忽略

"groups"是高級別的節(jié)點(diǎn)茴她,它們本身不指定一個(gè)值寻拂,但為properties提供一個(gè)有上下文關(guān)聯(lián)的分組。例如败京,server.port和server.servlet-path屬性是server組的一部分蛾茉。

注:不需要每個(gè)"property"都有一個(gè)"group"暇赤,一些屬性可以以自己的形式存在疟羹。

  • properties

    • name 屬性全名,格式為小寫虛線分割的形式(jiuxian.name-en).必須要有的
    • type 屬性數(shù)據(jù)類型,java.lang.Boolean。類型未知可忽略
    • description 該屬性的描述
    • sourceType 來源類型,例如妈拌,如果property來自一個(gè)被@ConfigurationProperties注解的類,該屬性將包括該類的全限定名埃儿。如果來源類型未知?jiǎng)t該屬性會被忽略
    • defaultValue 定義輸入時(shí)的默認(rèn)值,只是提示截亦,并不是真正的默認(rèn)值,可忽略
    • deprecated 是否廢棄 boolean 值
      • level 級別 error,warning
      • reason 廢棄原因
      • replacement 替代屬性晶姊,為properties 全名
  • hints 可以給屬性提供可選的值扒接,以級描述

    • name 屬性全名,不能為空
    • values 可選的值

詳細(xì)看示例

{
  "groups": [
    {
      "name": "jiuxian",
      "sourceType": "com.jiuxian.config.JiuxianProperties",
      "type": "com.jiuxian.config.JiuxianProperties"
    },
    {
      "name": "jiuxian.school",
      "sourceType": "com.jiuxian.config.School",
      "type": "com.jiuxian.config.School",
      "sourceMethod": "getSchool()"
    }
  ],
  "properties": [
    {
      "name": "jiuxian.name",
      "sourceType": "com.jiuxian.config.JiuxianProperties",
      "type": "java.lang.String",
      "deprecation": {
        "level": "error",
        "reason": "replacement nameCn.",
        "replacement": "jiuxian.name-cn"
      }
    },
    {
      "name": "jiuxian.name-cn",
      "sourceType": "com.jiuxian.config.JiuxianProperties",
      "type": "java.lang.String",
      "defaultValue": "jiuxian"
    }
  ],
  "hints": [
    {
      "name": "jiuxian.sex-enum",
      "values": [
        {
          "value": "man",
          "description": "man."
        },
        {
          "value": "woman",
          "description": "woman."
        }
      ]
    },
    {
      "name": "jiuxian.single",
      "values": [
        {
          "value": true,
          "description": "yes."
        },
        {
          "value": false,
          "description": "no."
        }
      ]
    }
  ]
}

idea 提示:


deprecated1.png

(2) 如何廢棄某個(gè)字段们衙,可以用代碼來注解

@Deprecated
private String name;

@Deprecated
public String getName() {
    return getNameCn();
}

@DeprecatedConfigurationProperty(replacement = "jiuxian.name-cn", reason = "replacement nameCn")
public void setName(String name) {
    setNameCn(name);
}

七钾怔、更多詳細(xì)介紹請參閱官網(wǎng)

Spring官網(wǎng)介紹

八、本文示例代碼

GitHub 源碼

【注】以上代碼基于Springboot 2.0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒙挑,一起剝皮案震驚了整個(gè)濱河市宗侦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忆蚀,老刑警劉巖矾利,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馋袜,居然都是意外死亡男旗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門欣鳖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來察皇,“玉大人,你說我怎么就攤上這事观堂∪猛” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵师痕,是天一觀的道長溃睹。 經(jīng)常有香客問我,道長胰坟,這世上最難降的妖魔是什么因篇? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮笔横,結(jié)果婚禮上竞滓,老公的妹妹穿的比我還像新娘。我一直安慰自己吹缔,他們只是感情好商佑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厢塘,像睡著了一般茶没。 火紅的嫁衣襯著肌膚如雪肌幽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天抓半,我揣著相機(jī)與錄音喂急,去河邊找鬼。 笑死笛求,一個(gè)胖子當(dāng)著我的面吹牛廊移,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播探入,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狡孔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了新症?” 一聲冷哼從身側(cè)響起步氏,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徒爹,沒想到半個(gè)月后荚醒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡界阁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胖喳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泡躯。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丽焊,靈堂內(nèi)的尸體忽然破棺而出较剃,到底是詐尸還是另有隱情,我是刑警寧澤技健,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布写穴,位于F島的核電站,受9級特大地震影響雌贱,放射性物質(zhì)發(fā)生泄漏啊送。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一欣孤、第九天 我趴在偏房一處隱蔽的房頂上張望馋没。 院中可真熱鬧,春花似錦降传、人聲如沸篷朵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽声旺。三九已至控硼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艾少,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工翼悴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缚够,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓鹦赎,卻偏偏與公主長得像谍椅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子古话,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容