09-SpringBoot屬性配置檔案
YAML型別的屬性核心配置檔案:application.yaml
YAML是 "YAML Ain't Markup Language"(YAML 不是一種標記語言)的遞迴縮寫,雖然是這樣說但是在開發中可以認為這是和XML一樣一種標記語言進行使用。所謂的標記語言,就是使用許多的的標籤來定義某些東西。
非常適合用來做以資料為中心的配置檔案。
1、基本語法
-
格式為 :
key: value # k:和v之間有一個空格
-
key和value的值是區分大小寫的
-
使用縮排表示層級關係,xml檔案中是用一個標籤的開閉表示一個級別,標籤內部的開閉標籤就是父子關係
-
縮排不允許使用tab,只允許使用空格
-
縮排的空格數不重要,只要相同層級的元素左對齊即可,所以,但是在idea中使用tab也沒關係,對的齊就行
-
表示註釋
-
當我們使用單引號和雙引號來修飾value的值時,如果value中有\n這種在Java語言中表示轉義的字元時:
雙引號修飾的話,輸出到控制檯的value值,\是發揮轉義的作用的,就是會換行。
單引號修飾的話,輸出到控制檯的value值,\是不發揮轉義的作用的,會把\n輸出來
2、valued的值為不同資料型別示例
-
字面量:單個、不可再分的值(就是一對一)。value的值是date、boolean、String、資料型別、null
k1: v1 k2: v2 k3: v3
-
物件:鍵值對的集合。value的值是map、hash、set、Object
#物件中是有屬性的,這個物件中的屬性在同一級,所以要對齊。但是屬性如果也是個物件,屬性的屬性就是下一級 #行內寫法: k: {k1: v1,k2: v2,k3: v3} #或這樣,這樣寫k:的後面是可以不用加空格的 k: k1: v1 k2: v2 k3: v3
-
陣列:一組按次序排列的值。array、list、queue。因為list集合部署鍵值對,所以和陣列一樣
#行內寫法: k: [v1,v2,v3] #或這樣,-表示k,k有多個值,就是陣列。-後面要有空格然後加v,注意沒有: k: - v1 - v2 - v3
3、示例:建立一個Person類,如下。然後進行配置繫結,建立一個application.yaml檔案在resources目錄下,和application.properties檔案是可以共存的,但是application.properties配置的優先順序是大於yaml的。
package com.studymyself.bean;
import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ConfigurationProperties(prefix = "person")//和配置檔案中字首為person的進行繫結
@Component//讓容器建立這個元件
@ToString
@Data
public class Person {
private String userName;
private Boolean boss;
private Date birth;
private Integer age;
private Pet pet;
private String[] interests;
private List<String> animal;
private Map<String, Object> score;
private Set<Double> salary;
private Map<String, List<Pet>> allPets;
}
person:
userName: 樸智妍
boss: true
birth: 1991/02/15 #註解要和資料加個空格,預設的Date生日格式以/分隔
age: 30
pet:
name: Tomcat
#interests: [football,games,listening] #行內寫法
interests:
- football
- games
- listening
animals: [阿貓,阿兔,成龍]
score: {數學: 126,英語: 125,語文: 130}
salary: [15893.00,48999.00,98653.00]
allPets:
生病動物:
- {name: 小貓}
- {name: 小兔}
健康動物: [name: 小狗,name: 小雞] #List是集合,可以用{},但只能儲存單面量。用[],可以儲存物件
在Controller類中寫一個介面,返回Person物件,測試介面。注意,我們要從容器中獲取person元件,用依賴注入@Resource獲取,測試的時候由於返回的是在方法中自己定義的一個Person引數,所以測試介面的時候,返回的json中person的屬性一直是空
package com.studymyself.controller;
import com.studymyself.bean.Person;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Slf4j
@RestController
public class MyController {
//注意要從容器中獲取person元件
@Resource
Person person;
@RequestMapping("/hello")
public String myController(){
//使用日誌,log屬性
log.error("警告:請求進來了");
return "你好啊!Spring Boot!";
}
@RequestMapping("/person")
public Person person(){
log.warn("提示:開始進行請求處理");
return person;
}
}
4、我們發現我們在yaml檔案時,即使用@ConfigurationProperties註解將javabean和屬性資源配置檔案綁定了,在編寫標籤值時,卻沒有提示,所以我們要解決這個問題。而且我們的Person類上面也一直提示我們沒有配置註釋處理器
將註釋處理器依賴新增到pom檔案中,然後再maven打包外掛中進行配置,具體如下
<!--註釋處理器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--配置maven打包外掛打包時忽略註釋處理器的jar包-->
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
然後重啟專案才會生效,重啟後停掉專案到yaml檔案中進行測試
5、JSR303資料校驗
意思就是在屬性欄位上增加一層過濾器驗證,可以保證資料的合法性。
使用方式:在需要屬性賦值的類中新增一個@Validated註解,然後在需要驗證的屬性上新增各種不同的驗證註解來約束這個欄位應該填什麼或是應該填什麼格式
如下
其中這個@Email註解中的message的值是報錯後的提示資訊,其中有預設值的。
還有很多這樣的校驗註解,具體如下
//空檢查
@Null 驗證物件是否為null
@NotNull 驗證物件是否不為null, 無法查檢長度為0的字串
@NotBlank 檢查約束字串是不是Null還有被Trim的長度是否大於0,只對字串,且會去掉前後空格.
@NotEmpty 檢查約束元素是否為NULL或者是EMPTY.
//Booelan檢查
@AssertTrue 驗證 Boolean 物件是否為 true
@AssertFalse 驗證 Boolean 物件是否為 false
//長度檢查
@Size(min=, max=) 驗證物件(Array,Collection,Map,String)長度是否在給定的範圍之內
@Length(min=, max=) Validates that the annotated string is between min and max included.
//日期檢查
@Past 驗證 Date 和 Calendar 物件是否在當前時間之前,驗證成立的話被註釋的元素一定是一個過去的日期
@Future 驗證 Date 和 Calendar 物件是否在當前時間之後 ,驗證成立的話被註釋的元素一定是一個將來的日期
@Pattern 驗證 String 物件是否符合正則表示式的規則,被註釋的元素符合制定的正則表示式,regexp:正則表示式 flags: 指定 Pattern.Flag 的陣列,表示正則表示式的相關選項。
//數值檢查
建議使用在Stirng,Integer型別,不建議使用在int型別上,因為表單值為“”時無法轉換為int,但可以轉換為Stirng為”“,Integer為null
@Min 驗證 Number 和 String 物件是否大等於指定的值
@Max 驗證 Number 和 String 物件是否小等於指定的值
@DecimalMax 被標註的值必須不大於約束中指定的最大值. 這個約束的引數是一個通過BigDecimal定義的最大值的字串表示.小數存在精度
@DecimalMin 被標註的值必須不小於約束中指定的最小值. 這個約束的引數是一個通過BigDecimal定義的最小值的字串表示.小數存在精度
@Digits 驗證 Number 和 String 的構成是否合法
@Digits(integer=,fraction=) 驗證字串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度。
@Range(min=, max=) 被指定的元素必須在合適的範圍內
@Range(min=10000,max=50000,message=”range.bean.wage”)
@Valid 遞迴的對關聯物件進行校驗, 如果關聯物件是個集合或者陣列,那麼對其中的元素進行遞迴校驗,如果是一個map,則對其中的值部分進行校驗.(是否進行遞迴驗證)
@CreditCardNumber信用卡驗證
@Email 驗證是否是郵件地址,如果為null,不進行驗證,算通過驗證。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)