使用@RequestBody配合@Valid校驗入參參數(shù)
更新時間:2022年03月15日 09:41:07 作者:擊水三千里
這篇文章主要介紹了使用@RequestBody配合@Valid校驗入參參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
@RequestBody配合@Valid校驗入參參數(shù)
自定義一個Controller
import com.example.demo.pojo.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;?
import javax.validation.Valid;
/**
?* @Author: luoye
?* @Date: 2018-10-12
?*/
@RestController
public class ValiController {
? ? @PostMapping(value = "/",produces = "application/json;charset=UTF-8")
? ? public User vali(@RequestBody @Valid User user){
? ? ? ? return user;
? ? }
}自定義實體類
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
?
/**
?* @Author: luoye
?* @Date: 2018-10-12
?*/
public class User {
? ? @NotBlank(message = "這個姓名不能為空")
? ? private String name;
? ? @NotNull(message = "這個年齡不能為空")
? ? @Max(value = 105,message = "太大了")
? ? private Integer age;
?
? ? public String getName() {
? ? ? ? return name;
? ? }
?
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }
?
? ? public Integer getAge() {
? ? ? ? return age;
? ? }
?
? ? public void setAge(Integer age) {
? ? ? ? this.age = age;
? ? }
}自定義全局異常處理器
import com.example.demo.pojo.ErrorMsg;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
?
import java.util.ArrayList;
import java.util.List;
?
/**
?* @Author luoye
?* @Date: 2018/10/12 16:50
?*/
@ControllerAdvice
public class ExceptionHandlerContrller {?
?
? ? @ExceptionHandler(MethodArgumentNotValidException.class)
? ? @ResponseBody
? ? public List<ErrorMsg> exception(MethodArgumentNotValidException e) {
? ? ? ? BindingResult bindingResult = e.getBindingResult();
? ? ? ? List<ObjectError> allErrors = bindingResult.getAllErrors();
? ? ? ? List<ErrorMsg> errorMsgs = new ArrayList<>();
?
? ? ? ? allErrors.forEach(objectError -> {
? ? ? ? ? ? ErrorMsg errorMsg = new ErrorMsg();
? ? ? ? ? ? FieldError fieldError = (FieldError)objectError;
? ? ? ? ? ? errorMsg.setField(fieldError.getField());
? ? ? ? ? ? errorMsg.setObjectName(fieldError.getObjectName());
? ? ? ? ? ? errorMsg.setMessage(fieldError.getDefaultMessage());
? ? ? ? ? ? errorMsgs.add(errorMsg);
? ? ? ? });
? ? ? ? return errorMsgs;
? ? }
}PostMan測試下
[
? ? {
? ? ? ? "field": "name",
? ? ? ? "message": "這個姓名不能為空",
? ? ? ? "objectName": "user"
? ? },
? ? {
? ? ? ? "field": "age",
? ? ? ? "message": "這個年齡不能為空",
? ? ? ? "objectName": "user"
? ? }
]附錄
@Valid 注解類型的使用:
@Null:限制只能為null@NotNull:限制必須不為null@AssertFalse:限制必須為false@AssertTrue:限制必須為true@DecimalMax(value):限制必須為一個不大于指定值的數(shù)字@DecimalMin(value):限制必須為一個不小于指定值的數(shù)字@Digits(integer,fraction):限制必須為一個小數(shù),且整數(shù)部分的位數(shù)不能超過integer,小數(shù)部分的位數(shù)不能超過fraction@Future:限制必須是一個將來的日期@Max(value):限制必須為一個不大于指定值的數(shù)字@Min(value):限制必須為一個不小于指定值的數(shù)字@Past:限制必須是一個過去的日期@Pattern(value):限制必須符合指定的正則表達式@Size(max,min):限制字符長度必須在min到max之間@Past:驗證注解的元素值(日期類型)比當前時間早@NotEmpty:驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)@NotBlank:驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同于@NotEmpty,@NotBlank只應用于字符串且在比較時會去除字符串的空格@Email:驗證注解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式
@Valid校驗@RequestBody的參數(shù)
希望通過注解校驗post請求的body
需要用到@Valid注解
public String getResponse(@RequestBody @Valid MyRequest request) throws Exception {
xxx
}
在request實體類添加注解進行校驗
例如用@NotNull進行判空校驗
@Data
public class MyRequest {
@NotNull(message = "id 不能為空")
private Integer id;
@NotNull(message = "name 不能為空")
private String name;
}

結合統(tǒng)一異常處理,處理MethodArgumentNotValidException
可以返回注解配置的錯誤信息
@ControllerAdvice
@Slf4j
public class ExceptionResolver {
@ExceptionHandler(value = {Exception.class})
@ResponseBody
public String handleOtherExceptions(final Exception ex) {
if (ex instanceof MethodArgumentNotValidException) {
// 入參校驗錯誤
StringBuilder msg = new StringBuilder();
MethodArgumentNotValidException mex = (MethodArgumentNotValidException) ex;
BindingResult bindingResult = mex.getBindingResult();
List<ObjectError> allErrors = bindingResult.getAllErrors();
allErrors.forEach(objectError -> {
FieldError fieldError = (FieldError) objectError;
String oneMsg = fieldError.getDefaultMessage();
msg.append(oneMsg);
msg.append(";");
});
return msg.toString();
}
}
}
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
mybatis實現(xiàn)增刪改查_動力節(jié)點Java學院整理
本文通過實例代碼給大家介紹了mybatis實現(xiàn)增刪改查功能,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-09-09
SpringBoot中使用configtree讀取樹形文件目錄中的配置詳解
這篇文章主要介紹了SpringBoot中使用configtree讀取樹形文件目錄中的配置詳解,configtree通過spring.config.import?+?configtree:前綴的方式,加載以文件名為key、文件內容為value的配置屬性,需要的朋友可以參考下2023-12-12
Java concurrency之共享鎖和ReentrantReadWriteLock_動力節(jié)點Java學院整理
本篇文章主要介紹了Java concurrency之共享鎖和ReentrantReadWriteLock,非常具有實用價值,需要的朋友可以參考下2017-06-06
如何利用Java?Agent?做Spring?MVC?Controller?層的出參入參打印日志
本文介紹了如何使用JavaAgent進行Spring?MVC?Controller層的出參入參打印日志,首先,建立了一個包含javassist和fastJSON依賴的Agent?jar工程,并創(chuàng)建了一個Agent類,然后,編譯并部署了這個Agent?jar,最后,在Demo?Web工程中啟用Agent以實現(xiàn)日志打印2024-11-11

