天天看點

SpringBoot常用注解@ConfigurationProperties松散綁定、資料校驗

作者:java易

目錄

  • @ConfigurationProperties
    • 源碼分析
    • 标注在類上
    • 标注在方法上
  • 松散綁定
  • 資料校驗

@ConfigurationProperties

源碼分析

@ConfigurationProperties主要作用就是将prefix屬性指定的字首配置項的值綁定到這個JavaBean上 ,通過指定的字首,來綁定配置檔案中的配置,通過如下源碼可以看出, 如果你想綁定和驗證一些外部屬性,可以将它添加到類定義或@Configuration類中的@Bean方法上。

SpringBoot常用注解@ConfigurationProperties松散綁定、資料校驗

标注在類上

@Data   //使用該注解需要導入Lombok依賴
@Component
@ConfigurationProperties(prefix = "userinfo")
public class UserInfo {

    private String userId;
    private String name;
}
           

application.yml檔案配置内容

userInfo:
  userId: 1001
  name: lucy
           

接下來通過控制器方法來傳回這個對象,檢視資料是否綁定

@RestController
public class HelloController {

    @Autowired
    private UserInfo userInfo;

    @GetMapping("/user")
    public UserInfo getUserInfo(){
        return userInfo;
    }
}
           
SpringBoot常用注解@ConfigurationProperties松散綁定、資料校驗

标注在方法上

上面源碼中說到可以将它添加到@Configuration類中的@Bean方法上,是以下面來看看标注在方法上是如何使用的!

比如我們用到druid資料源的操作,這個資料源是屬于第三方的,是以我們不能操作源碼,不能再源碼裡面找到它的對象來給他添加注解,但我們可以在yml檔案中給他配置,來拿到它的屬性。

首先添加所需的依賴

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.11</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
           

接着在yml檔案中配置資料源

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
      username: root
      password: root
           

建立一個配置類,然後在類方法上添加注解,并通過prefix綁定資料

@SpringBootConfiguration
public class DatasourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.database.druid")
    public DataSource database(){
        return new DruidDataSource();
    }
}
           

通過控制器方法來檢驗綁定效果

@RestController
public class HelloController {

    @Autowired
    private DataSource dataSource;

    @GetMapping("/datasource")
    public void getDataSource(){
        System.out.println(dataSource);
    }

}
           

通路http://localhost/datasource,檢視控制台輸出!!!

SpringBoot常用注解@ConfigurationProperties松散綁定、資料校驗

松散綁定

我們在使用 @ConfigurationProperties注解的時候,@ConfigurationProperties(prefix = “userinfo”),這裡給prefix的屬性值與yml檔案中的屬性名稱不一緻,但是依舊綁定成功了!原因是什麼呢?

這就需要提到Spring的松散綁定屬性規則。是以使用以下方式書寫都能與類的屬性名稱比對。

userInfo:
  userId: 1001 # 駝峰命名方式
  #user_id: 1002 #下劃線方式
  #user-id: 1003 #烤肉串方式
  #USER_ID: 1004 # 常量方式
  name: lucycd
           

需要注意的是,prefix的屬性值必須全部為小寫,就像下圖所示,就會報錯:字首必須是規範形式。

SpringBoot常用注解@ConfigurationProperties松散綁定、資料校驗

運作程式,也會在控制台提示你:配置屬性名稱“userInfo”無效;無效字元:“I”

SpringBoot常用注解@ConfigurationProperties松散綁定、資料校驗

資料校驗

Spring Boot中有很多配置檔案,配置檔案中我們可以自定義一些對應的屬性值。那麼這些屬性值是否合法呢?我們如何來校驗?在Java中有一種JSR303規範,我們可以針對一些對應的數值來進行校驗。按照規範來進行書寫,如果不符合要求就說明校驗失敗,反之,則成功!

SpringBoot也給出了強大的資料校驗功能,可以有效的避免此類問題的發生。在JAVA EE的JSR303規範中給出了具體的資料校驗标準,開發者可以根據自己的需要選擇對應的校驗架構,此處使用Hibernate提供的校驗架構來作為實作進行資料校驗。

導入驗證包和校驗實作包

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
           

添加注解@Validated

給屬性添加驗證規則

@Data
@Component
@ConfigurationProperties(prefix = "userinfo")
@Validated
public class UserInfo {

   @Max(value = 1000,message = "userid超出範圍了!")
   @Min(value = 0,message = "userid不能小于0!")
   private String userId;

   @Size(min = 2,max = 5,message = "name長度應該在2-5之間")
   private String name;
}
           

這裡我們先輸入不符合規範的資料,來驗證資料是否能夠校驗成功

userInfo:
  userId: 1001
  name: lucycd
           

編寫一個控制器方法來檢驗

@RestController
public class HelloController {

    @Autowired
    private UserInfo userInfo;

    @GetMapping("/user")
    public UserInfo getUserInfo(){
        return userInfo;
    }

}
           

運作程式,檢視控制台,校驗成功!!!

SpringBoot常用注解@ConfigurationProperties松散綁定、資料校驗

同樣,将資料修改為符合規則的資料,程式就可以成功運作了!!!

當然,這裡的校驗規則還有許多,@NotNull、@NotEmpty、@Email等等,可以根據實際情況選擇合适的注解。

SpringBoot常用注解@ConfigurationProperties松散綁定、資料校驗