使用@RequestBody配合@Valid校驗(yàn)入?yún)?shù)
@RequestBody配合@Valid校驗(yàn)入?yún)?shù)
自定義一個(gè)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; ? ? } }
自定義實(shí)體類
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 = "這個(gè)姓名不能為空") ? ? private String name; ? ? @NotNull(message = "這個(gè)年齡不能為空") ? ? @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測(cè)試下
[ ? ? { ? ? ? ? "field": "name", ? ? ? ? "message": "這個(gè)姓名不能為空", ? ? ? ? "objectName": "user" ? ? }, ? ? { ? ? ? ? "field": "age", ? ? ? ? "message": "這個(gè)年齡不能為空", ? ? ? ? "objectName": "user" ? ? } ]
附錄
@Valid 注解類型的使用:
@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格式
@Valid校驗(yàn)@RequestBody的參數(shù)
希望通過注解校驗(yàn)post請(qǐng)求的body
需要用到@Valid注解
public String getResponse(@RequestBody @Valid MyRequest request) throws Exception { xxx }
在request實(shí)體類添加注解進(jìn)行校驗(yàn)
例如用@NotNull進(jìn)行判空校驗(yàn)
@Data public class MyRequest { @NotNull(message = "id 不能為空") private Integer id; @NotNull(message = "name 不能為空") private String name; }
結(jié)合統(tǒng)一異常處理,處理MethodArgumentNotValidException
可以返回注解配置的錯(cuò)誤信息
@ControllerAdvice @Slf4j public class ExceptionResolver { @ExceptionHandler(value = {Exception.class}) @ResponseBody public String handleOtherExceptions(final Exception ex) { if (ex instanceof MethodArgumentNotValidException) { // 入?yún)⑿r?yàn)錯(cuò)誤 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(); } } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot啟動(dòng)過程(六)之內(nèi)嵌Tomcat中StandardHost、StandardContext和Sta
這篇文章主要介紹了Spring Boot啟動(dòng)過程(六)之內(nèi)嵌Tomcat中StandardHost、StandardContext和StandardWrapper的啟動(dòng)教程詳解,需要的朋友可以參考下2017-04-04Spring Boot 整合mybatis 與 swagger2
之前使用springMVC+spring+mybatis,總是被一些繁瑣的xml配置,還經(jīng)常出錯(cuò),下面把以前的一些ssm項(xiàng)目改成了spring boot + mybatis,相對(duì)于來說優(yōu)點(diǎn)太明顯了,具體內(nèi)容詳情大家通過本文學(xué)習(xí)吧2017-08-08Java數(shù)據(jù)庫(kù)連接_jdbc-odbc橋連接方式(詳解)
下面小編就為大家?guī)硪黄狫ava數(shù)據(jù)庫(kù)連接_jdbc-odbc橋連接方式(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08java輸入多個(gè)數(shù)據(jù)(不確定),排序,并求最大值的方法
今天小編就為大家分享一篇java輸入多個(gè)數(shù)據(jù)(不確定),排序,并求最大值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07SpringBoot和VUE源碼直接整合打包成jar的踩坑記錄
這篇文章主要介紹了SpringBoot和VUE源碼直接整合打包成jar的踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Springboot如何利用攔截器攔截請(qǐng)求信息收集到日志詳解
一些系統(tǒng)經(jīng)常需要關(guān)注用戶請(qǐng)求的具體信息,如用戶信息、請(qǐng)求參數(shù)、響應(yīng)結(jié)果等等,在SpringBoot應(yīng)用中可通過攔截器的方式統(tǒng)一處理,下面這篇文章主要給大家介紹了關(guān)于Springboot如何利用攔截器攔截請(qǐng)求信息收集到日志的相關(guān)資料,需要的朋友可以參考下2021-08-08java網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)介紹
這篇文章主要介紹了java網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)介紹,涉及OSI分層模型和TCP/IP分層模型的對(duì)應(yīng)關(guān)系、IP地址、端口號(hào)、tcp、udp等相關(guān)內(nèi)容,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-11-11