校驗(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)限制字符長(zhǎng)度必須在min到max之間@Past驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間早@NotEmpty驗(yàn)證注解的元素值不為null且不為空(字符串長(zhǎng)度不為0、集合大小不為0)@NotBlank驗(yàn)證注解的元素值不為空(不為null、去除首位空格后長(zhǎng)度為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編程之jdk1.4,jdk1.5和jdk1.6的區(qū)別分析(經(jīng)典)
這篇文章主要介紹了Java編程之jdk1.4,jdk1.5和jdk1.6的區(qū)別分析,結(jié)合實(shí)例形式較為詳細(xì)的分析說明了jdk1.4,jdk1.5和jdk1.6版本的使用區(qū)別,需要的朋友可以參考下2015-12-12
@JsonFormat?和?@DateTimeFormat?時(shí)間格式化注解(場(chǎng)景示例代碼)
這篇文章主要介紹了@JsonFormat和@DateTimeFormat時(shí)間格式化注解,本文通過場(chǎng)景示例代碼詳解給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
gateway網(wǎng)關(guān)與前端請(qǐng)求跨域問題的解決方案
這篇文章主要介紹了gateway網(wǎng)關(guān)與前端請(qǐng)求跨域問題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
java調(diào)用Oracle存儲(chǔ)過程的方法實(shí)例
這篇文章介紹了java調(diào)用Oracle存儲(chǔ)過程的方法實(shí)例,有需要的朋友可以參考一下2013-09-09
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(7)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07

