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ò)誤信息返回給用戶。
解決辦法
經(jīng)過(guò)一番搜索發(fā)現(xiàn)可以給類上每個(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è)接口類即可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面向?qū)ο蟮娜筇匦灾焕^承用法實(shí)例分析
這篇文章主要介紹了java面向?qū)ο蟮娜筇匦灾焕^承用法,結(jié)合實(shí)例形式分析了java面向?qū)ο蟪绦蛟O(shè)計(jì)中繼承的基本原理與具體使用方法,需要的朋友可以參考下2019-11-11
詳談HashMap和ConcurrentHashMap的區(qū)別(HashMap的底層源碼)
下面小編就為大家?guī)?lái)一篇詳談HashMap和ConcurrentHashMap的區(qū)別(HashMap的底層源碼)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
在IDEA中安裝MyBatis Log Plugin插件,執(zhí)行mybatis的sql語(yǔ)句(推薦)
這篇文章主要介紹了在IDEA中安裝MyBatis Log Plugin插件,執(zhí)行mybatis的sql語(yǔ)句,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
解決IDEA中下載free maven plugin插件無(wú)效的問(wèn)題
這篇文章主要介紹了解決IDEA中下載free maven plugin插件無(wú)效的問(wèn)題,本文通過(guò)圖文并茂的形式給大家分享解決方案,供大家參考,需要的朋友可以參考下2020-11-11
Java 中Timer和TimerTask 定時(shí)器和定時(shí)任務(wù)使用的例子
這篇文章主要介紹了Java 中Timer和TimerTask 定時(shí)器和定時(shí)任務(wù)使用的例子,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05
Scheduler定時(shí)任務(wù)調(diào)度詳解
文章介紹了SysJobServiceImpl類中定時(shí)任務(wù)調(diào)度的相關(guān)方法,包括清除、檢查存在性、創(chuàng)建、暫停、恢復(fù)、刪除任務(wù),以及觸發(fā)任務(wù),并提到了JobKey、CronUtils、ScheduleUtils、SpringUtils等工具類的使用,適用于Spring管理環(huán)境2025-01-01

