spring validation多層對(duì)象校驗(yàn)教程
spring validation多層對(duì)象校驗(yàn)
1、第一層對(duì)象定義
import java.io.Serializable;
import javax.validation.Valid;
/**
* 請(qǐng)求參數(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;
/**
* 請(qǐng)求頭信息
*/
private String head;
/**
* 請(qǐng)求主體信息
*/
@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、第二層對(duì)象
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層校驗(yàn)使用
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());
/**
* 校驗(yàn)
* @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校驗(yàn)對(duì)象多個(gè)字段返回的消息內(nèi)容順序隨機(jī)問(wèn)題
問(wèn)題描述
model中的代碼如下
public class User {
@NotNull(message = "id不能為空", groups = UserGroup.UPDATE.class)
protected Integer id;
/**
* 姓名
*/
@NotBlank(message = "請(qǐng)輸入姓名", groups = UserGroup.ADD.class)
private String name;
/**
* 性別
*/
@NotBlank(message = "請(qǐng)輸入性別", groups = UserGroup.ADD.class)
private String sex;
/**
* 手機(jī)號(hào)
*/
@NotBlank(message = "請(qǐng)輸入手機(jī)號(hào)", groups = UserGroup.ADD.class)
private String phone;
/**
* 郵箱
*/
@NotBlank(message = "請(qǐng)輸入郵箱", groups = UserGroup.ADD.class)
private String email;
/**
* 公司名
*/
@NotBlank(message = "請(qǐng)輸入公司名", groups = UserGroup.ADD.class)
private String companyName;
/**
* 職務(wù)
*/
@NotBlank(message = "請(qǐng)輸入職務(wù)", groups = UserGroup.ADD.class)
private String position;
}
定義的分組接口如下
public interface UserGroup {
interface ADD {
}
interface UPDATE {
}
}
在使用Spring的@Validated注解對(duì)對(duì)象中的多個(gè)參數(shù)進(jìn)行校驗(yàn)時(shí),在MethodArgumentNotValidException異常攔截器處發(fā)現(xiàn)如果有多個(gè)條件不符和校驗(yàn)規(guī)則的參數(shù),MethodArgumentNotValidException中的bindingResult.getAllErrors()異常消息集合中的數(shù)據(jù)是按照隨機(jī)順序返回的,按照正常邏輯來(lái)說(shuō),我們肯定是想要按順序?qū)⒌谝粋€(gè)不符合規(guī)范字段錯(cuò)誤信息返回給用戶(hù)。
解決辦法
經(jīng)過(guò)一番搜索發(fā)現(xiàn)可以給類(lèi)上每個(gè)驗(yàn)證的注解都指定不同的group,然后在創(chuàng)建一個(gè)interface接口添加@GroupSequence對(duì)加在字段上的那些接口進(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 = "請(qǐng)輸入姓名", groups = UserGroup.ADD.NAME.class)
private String name;
/**
* 性別 1.男 2.女 3.未知
*/
@NotBlank(message = "請(qǐng)輸入性別", groups = UserGroup.ADD.SEX.class)
private String sex;
/**
* 手機(jī)號(hào)
*/
@NotBlank(message = "請(qǐng)輸入手機(jī)號(hào)", groups = UserGroup.ADD.PHONE.class)
private String phone;
/**
* 郵箱
*/
@NotBlank(message = "請(qǐng)輸入郵箱", groups = UserGroup.ADD.EMAIL.class)
private String email;
/**
* 公司名
*/
@NotBlank(message = "請(qǐng)輸入公司名", groups = UserGroup.ADD.COMPANY_NAME.class)
private String companyName;
/**
* 職務(wù)
*/
@NotBlank(message = "請(qǐng)輸入職務(wù)", groups = UserGroup.ADD.POSITION.class)
private String position;
}
在@GroupSequence注解中指定設(shè)置的接口數(shù)組順序,然后在參數(shù)進(jìn)行校驗(yàn)的時(shí)候直接在@Validated注解中放入U(xiǎn)serGroup.ADD.class這個(gè)接口類(lèi)即可public Result add(@Validated(UserGroup.ADD.class) @RequestBody User user),validation就會(huì)按照順序返回錯(cuò)誤信息,在異常攔截器中直接這樣取出第一個(gè)錯(cuò)誤信息即可MethodArgumentNotValidException.getBindingResult().getAllErrors().get(0).getDefaultMessage()
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot使用Validation包進(jìn)行輸入?yún)?shù)校驗(yàn)
- Spring?Boot之Validation自定義實(shí)現(xiàn)方式的總結(jié)
- spring-boot-starter-validation?校驗(yàn)參數(shù)的實(shí)現(xiàn)
- SpringBoot之groups應(yīng)對(duì)不同的Validation規(guī)則自定義方式
- Spring4下validation數(shù)據(jù)校驗(yàn)無(wú)效(maven)的解決
- 關(guān)于Spring Validation數(shù)據(jù)校檢的使用流程分析
相關(guān)文章
Java 過(guò)濾器實(shí)現(xiàn)敏感詞匯過(guò)濾功能
通過(guò)使用 Java 過(guò)濾器,我們可以輕松地實(shí)現(xiàn)敏感詞匯過(guò)濾的功能,以保護(hù)用戶(hù)免受不良內(nèi)容的侵害,讓我們通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)演示我們的敏感詞匯過(guò)濾器是如何工作的,感興趣的朋友一起看看吧2024-01-01
mybatis 使用jdbc.properties文件設(shè)置不起作用的解決方法
這篇文章主要介紹了mybatis 使用jdbc.properties文件設(shè)置不起作用的解決方法,需要的朋友可以參考下2018-03-03
詳解Java8與Runtime.getRuntime().availableProcessors()
這篇文章主要介紹了詳解Java8與Runtime.getRuntime().availableProcessors(),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
itextpdf提取PDF文件中的任意頁(yè)碼實(shí)現(xiàn)示例
這篇文章主要為大家介紹了itextpdf提取PDF文件中的任意頁(yè)碼實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
java-流的使用完結(jié)與異常處理機(jī)制(詳解)
下面小編就為大家?guī)?lái)一篇java-流的使用完結(jié)與異常處理機(jī)制(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
SpringBoot多數(shù)據(jù)源配置并通過(guò)注解實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源
本文主要介紹了SpringBoot多數(shù)據(jù)源配置并通過(guò)注解實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
SpringBoot之logback-spring.xml不生效的解決方法
這篇文章主要介紹了SpringBoot之logback-spring.xml不生效的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
利用Java實(shí)現(xiàn)調(diào)用http請(qǐng)求
在實(shí)際開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要調(diào)用對(duì)方提供的接口或測(cè)試自己寫(xiě)的接口是否合適。本文就為大家準(zhǔn)備了幾個(gè)java調(diào)用http請(qǐng)求的幾種常見(jiàn)方式,需要的可以參考一下2022-08-08

