校驗非空的注解@NotNull如何取得自定義的message
校驗非空的注解@NotNull如何取得自定義的message
由于項目表單需要校驗字段過多,一個一個去判空太麻煩,所以用了@NotNull注解,字段為空會拋出MethodArgumentNotValidException異常。
接下來要取得@NotNull(message=“自定義異常”)里的message內容給前端顯示
直接貼上代碼:
public String getMessage(MethodArgumentNotValidException exception){ String message = exception.getBindingResult().getFieldError().getDefaultMessage(); return message; }
用法:定義一個全局異常處理
一旦發(fā)生該類異常,就會捕捉處理,返回給前端信息,返回類Result要根據自己項目業(yè)務需要來定義
@NotNull 等注解的簡單使用
springboot 2.3.0 以后不會自動引入jar包,所以要添加以下maven
2.3以前則不需要引入maven包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
注冊一個賬號, 有賬號+密碼
前端會做一個判空,但是后端同時也要做一個判空,防止url直接訪問
這時后端的代碼通常是
if(name!=null){ return "賬號不能為空,請重新輸入"; } else if(password!=null){ return "密碼不能為空,請重新輸入"; }
這樣就會顯得特別low,而且極不美觀
這時候就要用到一個注解@NotNull
簡單舉例說明:
@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層
簡單舉例說明
@RestController public class TestController { @RequestMapping("test1") public Object test1(@Valid @RequestBody UserInfo userInfo,BindingResult result){ //判斷有沒有異常錯誤,如果有則返回默認消息 if (result.hasErrors()){ String defaultMessage = result.getFieldError().getDefaultMessage(); return defaultMessage; } //打印一下數據結構 System.out.println(userInfo); //如果沒有錯誤,返回注冊成功 return "注冊成功"; } }
用postMan 傳入json 參數,name有值,年齡超過30歲
返回我們的設定
name 為null 同理,會按順序判斷!
但是問題又來了,難道我們每個Controller層的方法里面都要寫一個判斷方法?
當然不,這時候就要用到全局異常類了
起一個類
@ControllerAdvice public class ControllerException { @ResponseBody @ExceptionHandler(MethodArgumentNotValidException.class) public Object handleValidException(MethodArgumentNotValidException e) { //將錯誤信息返回給前臺 return e.getBindingResult().getFieldError().getDefaultMessage(); } }
為了有所區(qū)分,寫下另一個訪問方法
@RequestMapping("test2") public Object test1(@Valid @RequestBody UserInfo userInfo){ System.out.println(userInfo); return "注冊成功"; }
這時候我們傳入參數
到此結束,再也不用寫一堆各種判空了
附上 部分注解
@Null
限制只能為null@NotNull
限制必須不為null@AssertFalse
限制必須為false@AssertTrue
限制必須為true@DecimalMax(value)
限制必須為一個不大于指定值的數字@DecimalMin(value)
限制必須為一個不小于指定值的數字@Digits(integer,fraction)
限制必須為一個小數,且整數部分的位數不能超過integer,小數部分的位數不能超過fraction@Future
限制必須是一個將來的日期@Max(value)
限制必須為一個不大于指定值的數字@Min(value)
限制必須為一個不小于指定值的數字@Past
限制必須是一個過去的日期@Pattern(value)
限制必須符合指定的正則表達式@Size(max,min)
限制字符長度必須在min到max之間@Past
驗證注解的元素值(日期類型)比當前時間早@NotEmpty
驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)@NotBlank
驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同于@NotEmpty,@NotBlank只應用于字符串且在比較時會去除字符串的空格@Email
驗證注解的元素值是Email,也可以通過正則表達式和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) { //日志記錄錯誤信息 // log.error(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage()); //將錯誤信息返回給前臺 // return BaseResult.fail(500, Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage()); return e.getBindingResult().getFieldError().getDefaultMessage(); } }
不需要寫B(tài)indingResult 也可以返回message
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring Security實現(xiàn)基于角色的訪問控制框架
Spring Security是一個功能強大的安全框架,提供了基于角色的訪問控制、身份驗證、授權等安全功能,可輕松保護Web應用程序的安全,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-04-04Java中的System.arraycopy()淺復制方法詳解
這篇文章主要介紹了Java中的System.arraycopy()淺復制方法詳解,Java數組的復制操作可以分為深度復制和淺度復制,簡單來說深度復制,可以將對象的值和對象的內容復制;淺復制是指對對象引用的復制,需要的朋友可以參考下2023-11-11IDEA新建springboot項目時未生成pom.xml文件的解決操作
這篇文章主要給大家介紹了關于IDEA新建springboot項目時未生成pom.xml文件的解決操作方法,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2023-02-02