超實用,Spring Boot 讓yml,properties配置文件有提示

來源:https://www.jianshu.com/p/497d6a231b65

我們在引用spring官方start庫或者第三方start庫時,在寫配置文件時idea總是能精準的提示,並且鼠標可以點過去看具體屬性或者類,而自己寫的配置文件idea只會有“Cannot resolve configuration property …”這樣的提示。

我們現在也去配置我們自己的配置文件讓idea知道這些配置文件是幹什麼的。

一、需要的註解

  • @ConfigurationProperties 配置屬性文件,需要指定前綴 prefix
  • @EnableConfigurationProperties 啟用配置,需要指定啟用的配置類
  • @NestedConfigurationProperty 當一個類中引用了外部類,需要在該屬性上加該註解

二、POM依賴

<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-configuration-processor/<artifactid>
<optional>true/<optional>
/<dependency>

三、配置類


超實用,Spring Boot 讓yml,properties配置文件有提示

這個時候@ConfigurationProperties(prefix = "jiuxian") 註解會報錯not registered via @EnableConfigurationProperties or marked as Spring component。這需要加上@EnableConfigurationProperties就可以了

超實用,Spring Boot 讓yml,properties配置文件有提示

四、看效果

然後輸入 mvn clean package

這個時候properties和yml文件已經可以提示了,不過有一些會有問題,比如jiuxian.school,這是一個對象,idea並不能解析,而因為City對象是個內部類是可以解析的。



如圖:

超實用,Spring Boot 讓yml,properties配置文件有提示


超實用,Spring Boot 讓yml,properties配置文件有提示


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

@NestedConfigurationProperty
private School school;

然後輸入命令 mvn clean package

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

五、為什麼

為什麼一定要打包編譯後才可以呢?

看一下打包過後的結構,如圖:


超實用,Spring Boot 讓yml,properties配置文件有提示


idea之所以會代碼提示就是因為這個spring-configuration-metadata.json json文件。這個文件的生成依據的就是我們上面的配置。

六、進階配置

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

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

(1)該配置文件的節點信息

  • groups 有以下屬性: name group的全名,該屬性必須 type group數據類型的類名。例如,如果group是基於一個被@ConfigurationProperties註解的類,該屬性將包含該類的全限定名。如果基於一個@Bean方法,它將是該方法的返回類型。如果該類型未知,則該屬性將被忽略 description 一個簡短的group描述,用於展示給用戶,要.點結尾。如果沒有可用描述,該屬性將被忽略 sourceType 來源類名。例如,如果組基於一個被@ConfigurationProperties註解的@Bean方法,該屬性將包含@Configuration類的全限定名,該類包含此方法。如果來源類型未知,則該屬性將被忽略 sourceMethod 該組的方法的全名(包含括號及參數類型)。例如,被@ConfigurationProperties註解的@Bean方法名。如果源方法未知,該屬性將被忽略

"groups"是高級別的節點,它們本身不指定一個值,但為properties提供一個有上下文關聯的分組。例如,server.port和server.servlet-path屬性是server組的一部分。

注:不需要每個"property"都有一個"group",一些屬性可以以自己的形式存在。

  • properties name 屬性全名,格式為小寫虛線分割的形式(jiuxian.name-en).必須要有的 type 屬性數據類型,java.lang.Boolean。類型未知可忽略 description 該屬性的描述 sourceType 來源類型,例如,如果property來自一個被@ConfigurationProperties註解的類,該屬性將包括該類的全限定名。如果來源類型未知則該屬性會被忽略 defaultValue 定義輸入時的默認值,只是提示,並不是真正的默認值,可忽略 deprecated 是否廢棄 boolean 值 level 級別 error,warning reason 廢棄原因 replacement 替代屬性,為properties 全名
  • hints 可以給屬性提供可選的值,以級描述 name 屬性全名,不能為空 values 可選的值

詳細看示例


超實用,Spring Boot 讓yml,properties配置文件有提示


超實用,Spring Boot 讓yml,properties配置文件有提示

idea 提示:

超實用,Spring Boot 讓yml,properties配置文件有提示

(2) 如何廢棄某個字段,可以用代碼來註解

超實用,Spring Boot 讓yml,properties配置文件有提示

七、更多詳細介紹請參閱官網

https://docs.spring.io/spring-boot/docs/2.1.2.RELEASE/reference/html/configuration-metadata.html

八、本文示例代碼

https://github.com/drinkagain/SpringBoot2.0/tree/master/springboot-yml

【注】以上代碼基於Springboot 2.0


分享到:


相關文章: