spring validation多層對象校驗教程
spring validation多層對象校驗
1、第一層對象定義
import java.io.Serializable; import javax.validation.Valid; /** * 請求參數(shù) * @Title: ReqIn.java * @Package com.spring.pro.model * @Description: * @author ybwei * @date 2018年9月18日 下午1:43:26 * @version V1.0 */ public class ReqIn<T> implements Serializable{ private static final long serialVersionUID = 25549320423002325L; /** * 請求頭信息 */ private String head; /** * 請求主體信息 */ @Valid private T data; public String getHead() { return head; } public void setHead(String head) { this.head = head; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
2、第二層對象
import java.io.Serializable; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** * @Title: User.java * @Package com.spring.pro.model * @Description: * @author ybwei * @date 2018年9月18日 下午1:46:15 * @version V1.0 */ public class User implements Serializable{ private static final long serialVersionUID = 6747944028911495569L; private String id; @NotBlank private String name; @NotNull private Integer age; public String getId() { return id; } public void setId(String id) { this.id = id; } 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; } }
3、Controller層校驗使用
import javax.validation.Valid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSON; import com.spring.pro.model.ReqIn; import com.spring.pro.model.User; /** * @Title: UserController.java * @Package com.spring.pro.controller * @Description: * @author ybwei * @date 2018年9月18日 下午1:48:14 * @version V1.0 */ @RestController public class UserController { private Logger logger=LoggerFactory.getLogger(getClass()); /** * 校驗 * @param reqIn * @return * @author ybwei */ @PostMapping("/valid") public HttpStatus valid(@Valid @RequestBody ReqIn<User> reqIn){ logger.info("reqIn:{}",JSON.toJSONString(reqIn)); return HttpStatus.OK; } }
validation校驗對象多個字段返回的消息內(nèi)容順序隨機(jī)問題
問題描述
model中的代碼如下
public class User { @NotNull(message = "id不能為空", groups = UserGroup.UPDATE.class) protected Integer id; /** * 姓名 */ @NotBlank(message = "請輸入姓名", groups = UserGroup.ADD.class) private String name; /** * 性別 */ @NotBlank(message = "請輸入性別", groups = UserGroup.ADD.class) private String sex; /** * 手機(jī)號 */ @NotBlank(message = "請輸入手機(jī)號", groups = UserGroup.ADD.class) private String phone; /** * 郵箱 */ @NotBlank(message = "請輸入郵箱", groups = UserGroup.ADD.class) private String email; /** * 公司名 */ @NotBlank(message = "請輸入公司名", groups = UserGroup.ADD.class) private String companyName; /** * 職務(wù) */ @NotBlank(message = "請輸入職務(wù)", groups = UserGroup.ADD.class) private String position; }
定義的分組接口如下
public interface UserGroup { interface ADD { } interface UPDATE { } }
在使用Spring的@Validated注解對對象中的多個參數(shù)進(jìn)行校驗時,在MethodArgumentNotValidException異常攔截器處發(fā)現(xiàn)如果有多個條件不符和校驗規(guī)則的參數(shù),MethodArgumentNotValidException中的bindingResult.getAllErrors()異常消息集合中的數(shù)據(jù)是按照隨機(jī)順序返回的,按照正常邏輯來說,我們肯定是想要按順序?qū)⒌谝粋€不符合規(guī)范字段錯誤信息返回給用戶。
解決辦法
經(jīng)過一番搜索發(fā)現(xiàn)可以給類上每個驗證的注解都指定不同的group,然后在創(chuàng)建一個interface接口添加@GroupSequence對加在字段上的那些接口進(jìn)行匯總,如下:
public interface UserGroup { @GroupSequence({ADD.NAME.class, ADD.SEX.class, ADD.PHONE.class, ADD.EMAIL.class, ADD.COMPANY_NAME.class, ADD.POSITION.class}) interface ADD { interface NAME {} interface SEX {} interface PHONE {} interface EMAIL {} interface COMPANY_NAME {} interface POSITION {} } interface UPDATE { } }
Model
@NoArgsConstructor public class User { @NotNull(message = "id不能為空", groups = UserGroup.UPDATE.class) protected Integer id; /** * 姓名 */ @NotBlank(message = "請輸入姓名", groups = UserGroup.ADD.NAME.class) private String name; /** * 性別 1.男 2.女 3.未知 */ @NotBlank(message = "請輸入性別", groups = UserGroup.ADD.SEX.class) private String sex; /** * 手機(jī)號 */ @NotBlank(message = "請輸入手機(jī)號", groups = UserGroup.ADD.PHONE.class) private String phone; /** * 郵箱 */ @NotBlank(message = "請輸入郵箱", groups = UserGroup.ADD.EMAIL.class) private String email; /** * 公司名 */ @NotBlank(message = "請輸入公司名", groups = UserGroup.ADD.COMPANY_NAME.class) private String companyName; /** * 職務(wù) */ @NotBlank(message = "請輸入職務(wù)", groups = UserGroup.ADD.POSITION.class) private String position; }
在@GroupSequence注解中指定設(shè)置的接口數(shù)組順序,然后在參數(shù)進(jìn)行校驗的時候直接在@Validated注解中放入UserGroup.ADD.class這個接口類即可public Result add(@Validated(UserGroup.ADD.class) @RequestBody User user),validation就會按照順序返回錯誤信息,在異常攔截器中直接這樣取出第一個錯誤信息即可MethodArgumentNotValidException.getBindingResult().getAllErrors().get(0).getDefaultMessage()
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis 使用jdbc.properties文件設(shè)置不起作用的解決方法
這篇文章主要介紹了mybatis 使用jdbc.properties文件設(shè)置不起作用的解決方法,需要的朋友可以參考下2018-03-03詳解Java8與Runtime.getRuntime().availableProcessors()
這篇文章主要介紹了詳解Java8與Runtime.getRuntime().availableProcessors(),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06itextpdf提取PDF文件中的任意頁碼實現(xiàn)示例
這篇文章主要為大家介紹了itextpdf提取PDF文件中的任意頁碼實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08java-流的使用完結(jié)與異常處理機(jī)制(詳解)
下面小編就為大家?guī)硪黄猨ava-流的使用完結(jié)與異常處理機(jī)制(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09SpringBoot多數(shù)據(jù)源配置并通過注解實現(xiàn)動態(tài)切換數(shù)據(jù)源
本文主要介紹了SpringBoot多數(shù)據(jù)源配置并通過注解實現(xiàn)動態(tài)切換數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08SpringBoot之logback-spring.xml不生效的解決方法
這篇文章主要介紹了SpringBoot之logback-spring.xml不生效的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01