這篇文章主要介紹“如何使用Spring中@Validated分組校驗”,在日常操作中,相信很多人在如何使用Spring中@Validated分組校驗問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何使用Spring中@Validated分組校驗”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Spring @Validated分組校驗的使用
引入POM依賴
定義接收數據的Vo
統一異常處理類
測試類
頁面效果測試
使用@Validated分組遇到的坑
解決辦法
通過本文你能學習到@Validated 的基本使用,以及如何再spring-boot 中進行數據異常的統一處理
Spring Validation驗證框架對參數的驗證機制提供了@Validated(Spring's JSR-303規范,是標準JSR-303的一個變種),javax提供了@Valid(標準JSR-303規范),配合BindingResult可以直接提供參數驗證結果。
在檢驗入參是否符合規范時,使用@Validated或者@Valid在基本驗證功能上沒有太多區別。但是在分組、注解地方、嵌套驗證等功能上兩個有所不同,總體來說@validated 相當于 @Valid 驗證的升級版,功能更加強大。
接下來我們直接看下如何使用
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.Final</version> </dependency>
定義公共分組class(用于標記分組,可以像后面定義在Vo里面,但是建議一些常用的定義在外部),如下
public interface Add {
}public interface Edit {
}
注意注解中分組的的使用,為了演示,同時在內部定義了一個特殊分組類
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 {
//特殊用于修改年齡 標記使用 靈活放置位置
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 = "失敗,請填寫age"
)
@Pattern(regexp = AGE_REG,groups = {Add.class, ParamsVo.ModifyAge.class},
message = "失敗,請填寫正確age"
)
private String age;
...省略setter getter 方法....
} 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

到此為止,基本的使用相信也是沒有問題了
在使用@Validate注解分組校驗時,如果指定分組,所有的需要驗證的屬性都必須添加指定分組才會校驗


沒有指明分組的屬性都屬于Default,所以分組接口繼承Default就可以解決

到此,關于“如何使用Spring中@Validated分組校驗”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。