校驗(yàn)非空的注解@NotNull如何取得自定義的message
校驗(yàn)非空的注解@NotNull如何取得自定義的message
由于項(xiàng)目表單需要校驗(yàn)字段過多,一個(gè)一個(gè)去判空太麻煩,所以用了@NotNull注解,字段為空會(huì)拋出MethodArgumentNotValidException異常。
接下來要取得@NotNull(message=“自定義異常”)里的message內(nèi)容給前端顯示
直接貼上代碼:
public String getMessage(MethodArgumentNotValidException exception){ String message = exception.getBindingResult().getFieldError().getDefaultMessage(); return message; }
用法:定義一個(gè)全局異常處理
一旦發(fā)生該類異常,就會(huì)捕捉處理,返回給前端信息,返回類Result要根據(jù)自己項(xiàng)目業(yè)務(wù)需要來定義
@NotNull 等注解的簡(jiǎn)單使用
springboot 2.3.0 以后不會(huì)自動(dòng)引入jar包,所以要添加以下maven
2.3以前則不需要引入maven包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
注冊(cè)一個(gè)賬號(hào), 有賬號(hào)+密碼
前端會(huì)做一個(gè)判空,但是后端同時(shí)也要做一個(gè)判空,防止url直接訪問
這時(shí)后端的代碼通常是
if(name!=null){ return "賬號(hào)不能為空,請(qǐng)重新輸入"; } else if(password!=null){ return "密碼不能為空,請(qǐng)重新輸入"; }
這樣就會(huì)顯得特別low,而且極不美觀
這時(shí)候就要用到一個(gè)注解@NotNull
簡(jiǎn)單舉例說明:
@Data public class UserInfo { @NotNull(message = "姓名不能為null") private String name; @Max(value = 30,message = "年齡不能超過30") private Integer age; private Integer password; private String sex; }
Controller層
簡(jiǎn)單舉例說明
@RestController public class TestController { @RequestMapping("test1") public Object test1(@Valid @RequestBody UserInfo userInfo,BindingResult result){ //判斷有沒有異常錯(cuò)誤,如果有則返回默認(rèn)消息 if (result.hasErrors()){ String defaultMessage = result.getFieldError().getDefaultMessage(); return defaultMessage; } //打印一下數(shù)據(jù)結(jié)構(gòu) System.out.println(userInfo); //如果沒有錯(cuò)誤,返回注冊(cè)成功 return "注冊(cè)成功"; } }
用postMan 傳入json 參數(shù),name有值,年齡超過30歲
返回我們的設(shè)定
name 為null 同理,會(huì)按順序判斷!
但是問題又來了,難道我們每個(gè)Controller層的方法里面都要寫一個(gè)判斷方法?
當(dāng)然不,這時(shí)候就要用到全局異常類了
起一個(gè)類
@ControllerAdvice public class ControllerException { @ResponseBody @ExceptionHandler(MethodArgumentNotValidException.class) public Object handleValidException(MethodArgumentNotValidException e) { //將錯(cuò)誤信息返回給前臺(tái) return e.getBindingResult().getFieldError().getDefaultMessage(); } }
為了有所區(qū)分,寫下另一個(gè)訪問方法
@RequestMapping("test2") public Object test1(@Valid @RequestBody UserInfo userInfo){ System.out.println(userInfo); return "注冊(cè)成功"; }
這時(shí)候我們傳入?yún)?shù)
到此結(jié)束,再也不用寫一堆各種判空了
附上 部分注解
@Null
限制只能為null@NotNull
限制必須不為null@AssertFalse
限制必須為false@AssertTrue
限制必須為true@DecimalMax(value)
限制必須為一個(gè)不大于指定值的數(shù)字@DecimalMin(value)
限制必須為一個(gè)不小于指定值的數(shù)字@Digits(integer,fraction)
限制必須為一個(gè)小數(shù),且整數(shù)部分的位數(shù)不能超過integer,小數(shù)部分的位數(shù)不能超過fraction@Future
限制必須是一個(gè)將來的日期@Max(value)
限制必須為一個(gè)不大于指定值的數(shù)字@Min(value)
限制必須為一個(gè)不小于指定值的數(shù)字@Past
限制必須是一個(gè)過去的日期@Pattern(value)
限制必須符合指定的正則表達(dá)式@Size(max,min)
限制字符長度必須在min到max之間@Past
驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間早@NotEmpty
驗(yàn)證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)@NotBlank
驗(yàn)證注解的元素值不為空(不為null、去除首位空格后長度為0),不同于@NotEmpty,@NotBlank只應(yīng)用于字符串且在比較時(shí)會(huì)去除字符串的空格@Email
驗(yàn)證注解的元素值是Email,也可以通過正則表達(dá)式和flag指定自定義的email格式
二次更新:所有的Controller 都寫這樣的代碼就要封裝成異常類
import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * @author :lsy * @date :Created in 2020/7/23 10:13 * @modified By: */ @ControllerAdvice public class ControllerException { private final static String EXCEPTION_MSG_KEY = "Exception message : "; @ResponseBody @ExceptionHandler(MethodArgumentNotValidException.class) public Object handleValidException(MethodArgumentNotValidException e) { //日志記錄錯(cuò)誤信息 // log.error(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage()); //將錯(cuò)誤信息返回給前臺(tái) // return BaseResult.fail(500, Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage()); return e.getBindingResult().getFieldError().getDefaultMessage(); } }
不需要寫B(tài)indingResult 也可以返回message
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java使用UDP實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信
這篇文章主要為大家詳細(xì)介紹了java使用UDP實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之高級(jí)排序
這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之高級(jí)排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01關(guān)于Java中的mysql時(shí)區(qū)問題詳解
這篇文章主要給大家介紹了關(guān)于Java中mysql時(shí)區(qū)問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Spring Security實(shí)現(xiàn)基于角色的訪問控制框架
Spring Security是一個(gè)功能強(qiáng)大的安全框架,提供了基于角色的訪問控制、身份驗(yàn)證、授權(quán)等安全功能,可輕松保護(hù)Web應(yīng)用程序的安全,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-04-04關(guān)于Idea中的.properties文件顯示問題
這篇文章主要介紹了關(guān)于Idea中的.properties文件顯示問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Java中的System.arraycopy()淺復(fù)制方法詳解
這篇文章主要介紹了Java中的System.arraycopy()淺復(fù)制方法詳解,Java數(shù)組的復(fù)制操作可以分為深度復(fù)制和淺度復(fù)制,簡(jiǎn)單來說深度復(fù)制,可以將對(duì)象的值和對(duì)象的內(nèi)容復(fù)制;淺復(fù)制是指對(duì)對(duì)象引用的復(fù)制,需要的朋友可以參考下2023-11-11深入理解Java中Filter的作用種類及應(yīng)用場(chǎng)景
Filter(過濾器)是Java Web中的一種重要組件,可以對(duì)請(qǐng)求和響應(yīng)進(jìn)行攔截處理,對(duì)數(shù)據(jù)進(jìn)行過濾和處理。Filter可以實(shí)現(xiàn)許多功能,如:鑒權(quán)、日志記錄、字符編碼轉(zhuǎn)換、數(shù)據(jù)壓縮、請(qǐng)求重定向等等2023-04-04IDEA新建springboot項(xiàng)目時(shí)未生成pom.xml文件的解決操作
這篇文章主要給大家介紹了關(guān)于IDEA新建springboot項(xiàng)目時(shí)未生成pom.xml文件的解決操作方法,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02