springboot 引數校驗總結

2021-10-08 11:40:34 字數 3492 閱讀 6771

配置

spring-boot-starter-web包自動依賴hibernate-validator,不用再重複引入,直接開搞

org.springframework.boot

spring-boot-starter-web

org.hibernate

hibernate-validator

5.3.1.final

宣告乙個bean註冊到spring容器,這個bean是乙個容器後處理器,會把校驗的邏輯通過aop織入有@validated註解的class,具體可以看這個類的原始碼

這一步在springboot其實也不用做,validationautoconfiguration這個配置類自動幫我們做了

@bean

public methodvalidationpostprocessor methodvalidationpostprocessor()

驗證不通過會產生異常,因為我們專案提供rest介面,所以通過全域性捕獲異常,然後轉換為json給前台

@controlleradvice

public class globalexceptionhandler

string errormessage = msgbuilder.tostring();

if(errormessage.length()>1)

errorwebresult.setinfo(errormessage);

return errorwebresult;

}errorwebresult.setinfo(ex.getmessage());

return errorwebresult;

}@exceptionhandler(methodargumentnotvalidexception.class)

@responsebody

public webresult resolvemethodargumentnotvalidexception(methodargumentnotvalidexception ex)

string errormessage = msgbuilder.tostring();

if (errormessage.length() > 1)

errorwebresult.setinfo(errormessage);

return errorwebresult;

}errorwebresult.setinfo(ex.getmessage());

return errorwebresult;

}}

這兩個異常分別對應校驗的兩種使用方式

在方法裡面校驗

在bean物件裡面校驗

經過測試,以上兩種形式的資料驗證不僅僅對controller層有用,在service層也行,只要這個類在spring ioc容器裡面

@assertfalse 校驗false

@asserttrue 校驗true

@decimalmax(value=,inclusive=) 小於等於value,

inclusive=true,是小於等於

@decimalmin(value=,inclusive=) 與上類似

@max(value=) 小於等於value

@min(value=) 大於等於value

@notnull 檢查null

@past 檢查日期

@pattern(regex=,flag=) 正則

@size(min=, max=) 字串,集合,map限制大小

@valid 對po實體類進行校驗

這篇文章介紹的註解更全一點

@controller

@validated

public class validationcontroller

}

注意類名需要加註解@validated

校驗失敗會丟擲constraintviolationexception異常

然後我們在全域性異常捕獲類捕獲這個異常,返回給前台對應的錯誤json

給model類增加校驗註解

public class user
在controller對應user實體前增加@valid註解

@responsebody

public user validate2(@valid @requestbody user user)

message支援表示式和el表示式 ,比如message = "姓名長度限制為到 $")

想把錯誤描述統一寫到properties的話,在classpath下面新建validationmessages_zh_cn.properties檔案(注意value需要轉換為unicode編碼),然後用{}格式的佔位符

除了預設提供的校驗註解外,我們可以定義自己的校驗註解

@target()

@retention(runtime)

@documented

@constraint(validatedby = )

public @inte***ce handsomeboy ;

class<? extends payload> payload() default {};

}

注意:message用於顯示錯誤資訊這個欄位是必須的,groups和payload也是必須的

@constraint(validatedby = )用來指定處理這個註解邏輯的類

一開始寫了這個自定義註解和驗證類,發現沒有生效,最後發現是@constraint這個註解裡的類沒有配置,還跟了很多原始碼,蛋疼,總的來講,這個配置還是挺方便的

外國人寫的一篇部落格,介紹自定義驗證配置,挺全的

public class handsomeboyvalidator implements constraintvalidator

/*** 具體的校驗邏輯

* @param value

* @param context

* @return

*/@override

public boolean isvalid(user value, constraintvalidatorcontext context)

}

這邊的功能是user類裡面的name欄位必須和配置的一樣,否則輸出乙個事實

@responsebody

public user validate3(@valid @handsomeboy(name = "scj",message = "盛超傑第二帥") @requestbody user user)

如果驗證不通過,會輸出盛超傑第二帥,全域性異常處理器不要忘記配置

Spring Boot 引數校驗

開發過程中,後台的引數校驗是必不可少的,所以經常會看到類似下面這樣的 這樣寫並沒有什麼錯,還挺工整的,只是看起來不是很優雅而已。接下來,用validation來改寫這段 在spring boot的官網中,關於validation只是簡單的提了一句,如下 其實,spring validator和hib...

SpringBoot 引數校驗

採用註解式引數校驗機制 在control物件前新增標籤 valid 在校驗物件字段上面新增 notblank null 限制只能為null notnull 限制必須不為null assertfalse 限制必須為false asserttrue 限制必須為true decimalmax value ...

Spring Boot 引數校驗

開發過程中,後台的引數校驗是必不可少的,所以經常會看到類似下面這樣的 這樣寫並沒有什麼錯,還挺工整的,只是看起來不是很優雅而已。接下來,用validation來改寫這段 在spring boot的官網中,關於validation只是簡單的提了一句,如下 其實,spring validator和hib...