Spring 中@Validated 分組校驗的使用解析
Spring @Validated分組校驗的使用
通過本文你能學(xué)習(xí)到@Validated 的基本使用,以及如何再spring-boot 中進行數(shù)據(jù)異常的統(tǒng)一處理
Spring Validation驗證框架對參數(shù)的驗證機制提供了@Validated(Spring's JSR-303規(guī)范,是標(biāo)準(zhǔn)JSR-303的一個變種),javax提供了@Valid(標(biāo)準(zhǔn)JSR-303規(guī)范),配合BindingResult可以直接提供參數(shù)驗證結(jié)果。
在檢驗入?yún)⑹欠穹弦?guī)范時,使用@Validated或者@Valid在基本驗證功能上沒有太多區(qū)別。但是在分組、注解地方、嵌套驗證等功能上兩個有所不同,總體來說@validated 相當(dāng)于 @Valid 驗證的升級版,功能更加強大。
接下來我們直接看下如何使用
引入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
注意注解中分組的的使用,為了演示,同時在內(nèi)部定義了一個特殊分組類
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; //自定義一個正則 @NotBlank(groups = {Add.class, ParamsVo.ModifyAge.class}, message = "失敗,請?zhí)顚慳ge" ) @Pattern(regexp = AGE_REG,groups = {Add.class, ParamsVo.ModifyAge.class}, message = "失敗,請?zhí)顚懻_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 "失敗,請刷新重試"; } @ExceptionHandler(Exception.class) @ResponseBody public String handlerException(Exception ex){ ex.printStackTrace(); return "失敗,請刷新重試"; } }
測試類
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"; } }
頁面效果測試
不填age
填入一個錯誤age
到此為止,基本的使用相信也是沒有問題了
使用@Validated分組遇到的坑
在使用@Validate注解分組校驗時,如果指定分組,所有的需要驗證的屬性都必須添加指定分組才會校驗
解決辦法
沒有指明分組的屬性都屬于Default,所以分組接口繼承Default就可以解決
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 使用@Validated和@Valid 解決list校驗的問題
- Java中的三種校驗注解的使用(@Valid,@Validated和@PathVariable)
- spring @Validated 注解開發(fā)中使用group分組校驗的實現(xiàn)
- Java參數(shù)校驗@Validated、@Valid介紹及使用詳解
- SpringBoot參數(shù)校驗之@Validated的使用詳解
- @Valid和@Validated注解校驗以及異常處理方式
- 使用@Validated注解進行校驗卻沒有效果的解決
- Spring利用@Validated注解實現(xiàn)參數(shù)校驗詳解
- JAVA校驗之@Valid和@Validated實踐指南
相關(guān)文章
一文解決pom.xml報錯Dependency "xxx" not f
我們在使用maven進行jar包管理時有時會遇到pom.xml中報錯Dependency “XXX” not found,所以在本文中將給大家介紹一下pom.xml報錯Dependency "xxx" not found的解決方案,需要的朋友可以參考下2024-01-01這一次搞懂Spring代理創(chuàng)建及AOP鏈?zhǔn)秸{(diào)用過程操作
這篇文章主要介紹了這一次搞懂Spring代理創(chuàng)建及AOP鏈?zhǔn)秸{(diào)用過程操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Java 多線程學(xué)習(xí)詳細(xì)總結(jié)
本文主要介紹 Java 多線程的知識資料,這里整理了詳細(xì)的多線程內(nèi)容,及簡單實現(xiàn)代碼,有需要的朋友可以參考下2016-09-09mybatis整合spring實現(xiàn)開啟mapper.xml映射文件掃描
這篇文章主要介紹了mybatis整合spring實現(xiàn)開啟mapper.xml映射文件掃描,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10