SpringBoot中如何使用Validation進(jìn)行參數(shù)校驗(yàn)?這篇文章運(yùn)用了實(shí)例代碼展示,代碼非常詳細(xì),可供感興趣的小伙伴們參考借鑒,希望對(duì)大家有所幫助。
創(chuàng)新互聯(lián)建站是一家專業(yè)提供林芝企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、H5場(chǎng)景定制、小程序制作等業(yè)務(wù)。10年已為林芝眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
如果已經(jīng)引用了spring-boot-starter-web,就不要需要引用spring-boot-starter-validation了,本例就不再引用
<!-- 引入validation支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
分組使用,不分組的話,不需要?jiǎng)?chuàng)建接口,可直接跳過此步
import javax.validation.GroupSequence;
public class ToolInterface {
// 新增使用(配合spring的@Validated功能分組使用)
public interface insert{}
// 更新使用(配合spring的@Validated功能分組使用)
public interface update{}
// 屬性必須有這兩個(gè)分組的才驗(yàn)證(配合spring的@Validated功能分組使用)
@GroupSequence({insert.class, update.class})
public interface all{};
}
groups 指定分組,可屬于多個(gè)組
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import com.qfx.modules.common.util.ToolInterface;
public class UserVo {
@Min(groups = {ToolInterface.update.class}, value = 1, message = "ID不能小于1")
private int id;
@NotBlank(groups = {ToolInterface.update.class, ToolInterface.insert.class}, message = "用戶名不能為空")
private String name;
@NotBlank(groups = {ToolInterface.update.class, ToolInterface.insert.class}, message = "密碼不能為空")
@Size(groups = {ToolInterface.update.class, ToolInterface.insert.class}, min = 6, max = 12, message = "密碼長(zhǎng)度不能小于6,大于12")
private String password;
@Min(value = 1, message = "年齡必須大于1歲")
@Max(value = 200, message = "年齡必須小于200歲")
private int age;
private String remark;
// get、set方法略過...,如果使用Lombok則不需要寫get、set方法了,原因你懂的...
}
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import com.qfx.modules.common.vo.MessageBean;
public class ToolValidated {
private static final Logger LOG = LoggerFactory.getLogger(ToolValidated.class);
// 實(shí)際使用建議將編碼信息放置在一個(gè)單獨(dú)的文件中統(tǒng)一管理
/**
* 操作成功
*/
public static int SUCCESS = 200;
/**
* 參數(shù)無效
*/
public static int PARAM_INVALID = 1001;
// =================== Spring validated (建議使用) ===================
/**
* <h6>功能:驗(yàn)證參數(shù)信息是否有效</h6>
*
* @param bindingResult
* @return
*/
public static MessageBean myValidate(BindingResult bindingResult) {
MessageBean messageBean = new MessageBean();
if(bindingResult.hasErrors()) {
// 設(shè)置驗(yàn)證結(jié)果狀態(tài)碼
messageBean.setCode(PARAM_INVALID);
// 獲取錯(cuò)誤字段信息集合
List<FieldError> fieldErrorList = bindingResult.getFieldErrors();
// 使用TreeSet是為了讓輸出的內(nèi)容有序輸出(默認(rèn)驗(yàn)證的順序是隨機(jī)的)
Set<String> errorInfoSet = new TreeSet<String>();
for (FieldError fieldError : fieldErrorList) {
// 遍歷錯(cuò)誤字段信息
errorInfoSet.add(fieldError.getDefaultMessage());
LOG.debug("[{}.{}]{}", fieldError.getObjectName() , fieldError.getField(), fieldError.getDefaultMessage());
}
StringBuffer sbf = new StringBuffer();
for (String errorInfo : errorInfoSet) {
sbf.append(errorInfo);
sbf.append(",");
}
messageBean.setMessage(sbf.substring(0, sbf.length() - 1));
}
return messageBean;
}
}
5.1.1 創(chuàng)建測(cè)試類TestCtl.java
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSONObject;
import com.qfx.modules.common.util.ToolInterface;
import com.qfx.modules.common.util.ToolValidated;
import com.qfx.modules.common.vo.MessageBean;
import com.qfx.modules.demo.vo.UserVo;
/**
* <h6>描述:實(shí)體類參數(shù)校驗(yàn)示例</h6>
* 本類示例僅適用于實(shí)體類參數(shù)校驗(yàn),方法參數(shù)校驗(yàn)請(qǐng)參照TestExtCtl.java中的validatedFive方法
*/
@RestController
@RequestMapping("test")
public class TestCtl {
/**
* <h6>功能:只驗(yàn)證未UserVo中設(shè)置group的屬性</h6>
* 只驗(yàn)證不需要分組的參數(shù),這里只驗(yàn)證userVo.age
* @param userVo
* @param bindingResult
* @return
*/
@RequestMapping("validatedOne")
public String validatedOne(@Validated() UserVo userVo, BindingResult bindingResult) {
// 驗(yàn)證參數(shù)信息是否有效
MessageBean messageBean = ToolValidated.myValidate(bindingResult);
if (ToolValidated.SUCCESS == messageBean.getCode()) {
messageBean.setMessage("哈哈哈,通過驗(yàn)證了");
}
return JSONObject.toJSONString(messageBean);
}
/**
* <h6>功能:只驗(yàn)證UserVo中g(shù)roup為"ToolValidated.insert.class"的屬性</h6>
* 驗(yàn)證組為"insert.class"的參數(shù),這里驗(yàn)證userVo.name、驗(yàn)證userVo.password
* @param userVo
* @param bindingResult
* @return
*/
@RequestMapping("validatedTwo")
public String validatedTwo(@Validated(ToolInterface.insert.class) UserVo userVo, BindingResult bindingResult) {
// 驗(yàn)證參數(shù)信息是否有效
MessageBean messageBean = ToolValidated.myValidate(bindingResult);
if (ToolValidated.SUCCESS == messageBean.getCode()) {
messageBean.setMessage("哈哈哈,通過驗(yàn)證了");
}
return JSONObject.toJSONString(messageBean);
}
/**
* <h6>功能:只驗(yàn)證UserVo中g(shù)roup為"ToolValidated.update.class"的屬性</h6>
* 驗(yàn)證組為"update.class"的參數(shù),這里驗(yàn)證userVo.id、userVo.name、驗(yàn)證userVo.password
* @param userVo
* @param bindingResult
* @return
*/
@RequestMapping("validatedThree")
public String validatedThree(@Validated(ToolInterface.update.class) UserVo userVo, BindingResult bindingResult) {
// 驗(yàn)證參數(shù)信息是否有效
MessageBean messageBean = ToolValidated.myValidate(bindingResult);
if (ToolValidated.SUCCESS == messageBean.getCode()) {
messageBean.setMessage("哈哈哈,通過驗(yàn)證了");
}
return JSONObject.toJSONString(messageBean);
}
/**
* <h6>功能:只驗(yàn)證UserVo中同時(shí)滿足多個(gè)group的屬性</h6>
* 驗(yàn)證組為"all.class"的參數(shù),all接口包含insert.class和 update.class,
* 因此需要驗(yàn)證同時(shí)屬于insert.class和 update.class的參數(shù),
* 這里只驗(yàn)證userVo.name、驗(yàn)證userVo.password
* @param userVo
* @param bindingResult
* @return
*/
@RequestMapping("validatedFour")
public String validatedFour(@Validated(ToolInterface.all.class) UserVo userVo, BindingResult bindingResult) {
// 驗(yàn)證參數(shù)信息是否有效
MessageBean messageBean = ToolValidated.myValidate(bindingResult);
if (ToolValidated.SUCCESS == messageBean.getCode()) {
messageBean.setMessage("哈哈哈,通過驗(yàn)證了");
}
return JSONObject.toJSONString(messageBean);
}
}
5.1.2 測(cè)試
5.2.1 創(chuàng)建一個(gè)全局自動(dòng)處理類ParamVerifyException.java
import java.util.Set;
import java.util.TreeSet;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.alibaba.fastjson.JSONObject;
import com.qfx.modules.common.util.ToolValidated;
import com.qfx.modules.common.vo.MessageBean;
/**
* <h6>描述:全局參數(shù)驗(yàn)證異常處理</h6>
* 設(shè)定執(zhí)行順序,只要比全局異常處理類靠前就行,否則會(huì)報(bào)500或者404錯(cuò)誤信息
* 這里的全局異常處理類是MyExceptionHandler.java
*/
@RestControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE - 1)
public class ParamVerifyException {
private static final Logger LOG = LoggerFactory.getLogger(ParamVerifyException.class);
/**
* <h6>功能:處理普通參數(shù)校驗(yàn)失敗的異常</h6>
*
* @param ex ConstraintViolationException
* @return
*/
@ExceptionHandler(value = ConstraintViolationException.class)
public String ConstraintViolationException(ConstraintViolationException ex) {
MessageBean messageBean = new MessageBean();
// 使用TreeSet是為了讓輸出的內(nèi)容有序輸出(默認(rèn)驗(yàn)證的順序是隨機(jī)的)
Set<String> errorInfoSet = new TreeSet<String>();
Set<ConstraintViolation<?>> violations = ex.getConstraintViolations();
if (!violations.isEmpty()) {
// 設(shè)置驗(yàn)證結(jié)果狀態(tài)碼
messageBean.setCode(ToolValidated.PARAM_INVALID);
for (ConstraintViolation<?> item : violations) {
System.out.println(item.getPropertyPath());
// 遍歷錯(cuò)誤字段信息
errorInfoSet.add(item.getMessage());
LOG.debug("[{}]{}", item.getPropertyPath(), item.getMessage());
}
StringBuffer sbf = new StringBuffer();
for (String errorInfo : errorInfoSet) {
sbf.append(errorInfo);
sbf.append(",");
}
messageBean.setMessage(sbf.substring(0, sbf.length() - 1));
}
return JSONObject.toJSONString(messageBean);
}
/**
* <h6>功能: 處理實(shí)體類參數(shù)校驗(yàn)失敗的異常</h6>
*
* @param ex BindException
* @return
*/
@ExceptionHandler(value = BindException.class)
public String BindException(BindException bindingResult) {
// 驗(yàn)證參數(shù)信息是否有效
MessageBean messageBean = ToolValidated.myValidate(bindingResult);
return JSONObject.toJSONString(messageBean);
}
}
5.2.2 創(chuàng)建測(cè)試類TestExtCtl.java
這里沒有指定驗(yàn)證信息處理類,全部由ParamVerifyException.java自動(dòng)攔截處理
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSONObject;
import com.qfx.modules.common.util.ToolInterface;
import com.qfx.modules.common.vo.MessageBean;
import com.qfx.modules.demo.vo.UserVo;
/**
* <h6>描述:實(shí)體類參數(shù)與普通參數(shù)校驗(yàn)示例</h6>
* 采用全局異常處理的方式來進(jìn)行參數(shù)校驗(yàn)
*/
@RestController
@RequestMapping("testExt")
@Validated // @Validated只能作用在類上面
public class TestExtCtl {
/**
* <h6>功能:只驗(yàn)證未UserVo中設(shè)置group的屬性</h6>
*
* @param userVo
* @return
*/
@RequestMapping("validatedOne")
public String validatedOne(@Validated() UserVo userVo) {
MessageBean messageBean = new MessageBean("哈哈哈,通過驗(yàn)證了");
return JSONObject.toJSONString(messageBean);
}
/**
* <h6>功能:只驗(yàn)證UserVo中g(shù)roup為"insert.class"的屬性</h6>
*
* @param userVo
* @return
*/
@RequestMapping("validatedTwo")
public String validatedTwo(@Validated(ToolInterface.insert.class) UserVo userVo) {
MessageBean messageBean = new MessageBean("哈哈哈,通過驗(yàn)證了");
return JSONObject.toJSONString(messageBean);
}
/**
* <h6>功能:只驗(yàn)證UserVo中g(shù)roup為"update.class"的屬性</h6>
*
* @param userVo
* @return
*/
@RequestMapping("validatedThree")
public String validatedThree(@Validated(ToolInterface.update.class) UserVo userVo) {
MessageBean messageBean = new MessageBean("哈哈哈,通過驗(yàn)證了");
return JSONObject.toJSONString(messageBean);
}
/**
* <h6>功能:只驗(yàn)證UserVo中同時(shí)滿足多個(gè)group的屬性(一般不使用這個(gè))</h6>
* all.class中同時(shí)包含了insert.class和update.class
* @param userVo
* @return
*/
@RequestMapping("validatedFour")
public String validatedFour(@Validated(ToolInterface.all.class) UserVo userVo) {
MessageBean messageBean = new MessageBean("哈哈哈,通過驗(yàn)證了");
return JSONObject.toJSONString(messageBean);
}
/**
* <h6>功能:直接參數(shù)校驗(yàn)</h6>
* 驗(yàn)證框架里面大部分都不需要我們顯示設(shè)置message,每個(gè)注解框架都給了一個(gè)默認(rèn)提示語,大多數(shù)提示還都比較友好
* 不建議對(duì)原始類型數(shù)據(jù)如int進(jìn)行參數(shù)校驗(yàn)(支持不好,會(huì)報(bào)異常),建議綁定實(shí)體參數(shù)校驗(yàn),如上面幾個(gè)方法的校驗(yàn)方式
* @param name
* @param bindingResult
* @return
*/
@RequestMapping("validatedFive")
public String validatedFive(
@NotBlank(message = "姓名不能為空") String name,
@Min(value = 10, message = "年齡必須大于10歲") Integer age
) {
MessageBean messageBean = new MessageBean("哈哈哈,通過驗(yàn)證了");
return JSONObject.toJSONString(messageBean);
}
}
5.2.3 測(cè)試
import java.util.Date;
/**
* @功能描述: JSON模型 用戶后臺(tái)向前臺(tái)返回的JSON對(duì)象
*/
public class MessageBean {
private int code = 200; // 返回編碼
private String message = ""; // 提示信息
private Object data = null; // 其他信息
private Long time = new Date().getTime();
public MessageBean() {
super();
}
public MessageBean(String message) {
super();
this.message = message;
}
public MessageBean(Object data) {
super();
this.data = data;
}
public MessageBean(int code, String message) {
super();
this.code = code;
this.message = message;
}
public MessageBean(String message, Object data) {
super();
this.message = message;
this.data = data;
}
public MessageBean(int code, String message, Object data) {
super();
this.code = code;
this.message = message;
this.data = data;
}
// get、set方法略過,如果使用Lombok則不需要寫get、set方法了
}
以上就是使用Validation進(jìn)行參數(shù)校驗(yàn)的具體操作,代碼詳細(xì)清楚,如果在日常工作遇到這個(gè)問題,希望你能通過這篇文章解決問題。如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章題目:SpringBoot中如何使用Validation進(jìn)行參數(shù)校驗(yàn)
本文來源:http://muchs.cn/article8/gjsgip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、網(wǎng)站建設(shè)、搜索引擎優(yōu)化、關(guān)鍵詞優(yōu)化、網(wǎng)站排名、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)