Spring 中@Validated 分組校驗(yàn)的使用解析
Spring @Validated分組校驗(yàn)的使用
通過(guò)本文你能學(xué)習(xí)到@Validated 的基本使用,以及如何再spring-boot 中進(jìn)行數(shù)據(jù)異常的統(tǒng)一處理
Spring Validation驗(yàn)證框架對(duì)參數(shù)的驗(yàn)證機(jī)制提供了@Validated(Spring's JSR-303規(guī)范,是標(biāo)準(zhǔn)JSR-303的一個(gè)變種),javax提供了@Valid(標(biāo)準(zhǔn)JSR-303規(guī)范),配合BindingResult可以直接提供參數(shù)驗(yàn)證結(jié)果。
在檢驗(yàn)入?yún)⑹欠穹弦?guī)范時(shí),使用@Validated或者@Valid在基本驗(yàn)證功能上沒(méi)有太多區(qū)別。但是在分組、注解地方、嵌套驗(yàn)證等功能上兩個(gè)有所不同,總體來(lái)說(shuō)@validated 相當(dāng)于 @Valid 驗(yàn)證的升級(jí)版,功能更加強(qiáng)大。
接下來(lái)我們直接看下如何使用
引入POM依賴
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
定義公共分組class(用于標(biāo)記分組,可以像后面定義在Vo里面,但是建議一些常用的定義在外部),如下
public interface Add {
}
public interface Edit {
}

定義接收數(shù)據(jù)的Vo
注意注解中分組的的使用,為了演示,同時(shí)在內(nèi)部定義了一個(gè)特殊分組類
import com.example.jsr.commmon.Add;
import com.example.jsr.commmon.Edit;
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.Pattern;
public class ParamsVo {
//特殊用于修改年齡 標(biāo)記使用 靈活放置位置
public interface ModifyAge {
}
//年齡是1-120之間有效
public static final String AGE_REG = "/^(?:[1-9][0-9]?|1[01][0-9]|120)$/";
@NotBlank(
groups = {Edit.class, ParamsVo.ModifyAge.class},
message = "失敗,id不能為空"
)
private String id;
@NotBlank(groups = {Edit.class, Add.class}, message = "失敗,名字不能為空")
private String name;
//自定義一個(gè)正則
@NotBlank(groups = {Add.class, ParamsVo.ModifyAge.class},
message = "失敗,請(qǐng)?zhí)顚?xiě)age"
)
@Pattern(regexp = AGE_REG,groups = {Add.class, ParamsVo.ModifyAge.class},
message = "失敗,請(qǐng)?zhí)顚?xiě)正確age"
)
private String age;
...省略setter getter 方法....
}
統(tǒng)一異常處理類
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 全局異常處理
*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BindException.class)
@ResponseBody
public String handlerUnexpectedTypeException(BindException ex){
BindingResult result = ex.getBindingResult();
if (result.hasErrors()) {
FieldError fieldError = result.getFieldError();
if (fieldError != null) {
return fieldError.getDefaultMessage();
}
}
return "失敗,請(qǐng)刷新重試";
}
@ExceptionHandler(Exception.class)
@ResponseBody
public String handlerException(Exception ex){
ex.printStackTrace();
return "失敗,請(qǐng)刷新重試";
}
}
測(cè)試類
import com.example.jsr.Vo.ParamsVo;
import com.example.jsr.commmon.Add;
import com.example.jsr.commmon.Edit;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/validated/test")
public class ValidatedTestController {
@RequestMapping("/add")
@ResponseBody
public String add(
@Validated(Add.class)ParamsVo paramsVo){
System.out.println(String.format("add obj = {%s}",paramsVo.toString()));
return "success";
}
@RequestMapping("/edit")
@ResponseBody
public String editAll(
@Validated({Edit.class,ParamsVo.ModifyAge.class})ParamsVo paramsVo){
System.out.println(String.format("edit obj = {%s}",paramsVo.toString()));
return "success";
}
}
頁(yè)面效果測(cè)試
不填age

填入一個(gè)錯(cuò)誤age

到此為止,基本的使用相信也是沒(méi)有問(wèn)題了
使用@Validated分組遇到的坑
在使用@Validate注解分組校驗(yàn)時(shí),如果指定分組,所有的需要驗(yàn)證的屬性都必須添加指定分組才會(huì)校驗(yàn)


解決辦法
沒(méi)有指明分組的屬性都屬于Default,所以分組接口繼承Default就可以解決

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 使用@Validated和@Valid 解決list校驗(yàn)的問(wèn)題
- Java中的三種校驗(yàn)注解的使用(@Valid,@Validated和@PathVariable)
- spring @Validated 注解開(kāi)發(fā)中使用group分組校驗(yàn)的實(shí)現(xiàn)
- Java參數(shù)校驗(yàn)@Validated、@Valid介紹及使用詳解
- SpringBoot參數(shù)校驗(yàn)之@Validated的使用詳解
- @Valid和@Validated注解校驗(yàn)以及異常處理方式
- 使用@Validated注解進(jìn)行校驗(yàn)卻沒(méi)有效果的解決
- Spring利用@Validated注解實(shí)現(xiàn)參數(shù)校驗(yàn)詳解
- JAVA校驗(yàn)之@Valid和@Validated實(shí)踐指南
相關(guān)文章
一文解決pom.xml報(bào)錯(cuò)Dependency "xxx" not f
我們?cè)谑褂胢aven進(jìn)行jar包管理時(shí)有時(shí)會(huì)遇到pom.xml中報(bào)錯(cuò)Dependency “XXX” not found,所以在本文中將給大家介紹一下pom.xml報(bào)錯(cuò)Dependency "xxx" not found的解決方案,需要的朋友可以參考下2024-01-01
這一次搞懂Spring代理創(chuàng)建及AOP鏈?zhǔn)秸{(diào)用過(guò)程操作
這篇文章主要介紹了這一次搞懂Spring代理創(chuàng)建及AOP鏈?zhǔn)秸{(diào)用過(guò)程操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Java 多線程學(xué)習(xí)詳細(xì)總結(jié)
本文主要介紹 Java 多線程的知識(shí)資料,這里整理了詳細(xì)的多線程內(nèi)容,及簡(jiǎn)單實(shí)現(xiàn)代碼,有需要的朋友可以參考下2016-09-09
mybatis整合spring實(shí)現(xiàn)開(kāi)啟mapper.xml映射文件掃描
這篇文章主要介紹了mybatis整合spring實(shí)現(xiàn)開(kāi)啟mapper.xml映射文件掃描,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
mybatis-plus分頁(yè)無(wú)效問(wèn)題解決
本文主要介紹了mybatis-plus分頁(yè)無(wú)效問(wèn)題解決,原因是配置分頁(yè)插件的版本問(wèn)題,舊版本和新版本的MyBatis-Plus需要不同的分頁(yè)配置,感興趣的可以了解一下2025-03-03

