在真實的開發中,我們經常會遇到需要對數據進行校驗的業務,那么本篇文章對此進行總結。暫時總結三種方法,大家可以根據需要選擇使用。
一、Java Bean Validation 驗證 【校驗處理】一、Java Bean Validation驗證
二、SpringBoot Validate 統一處理 【校驗處理】二、SpringBoot Validate 統一處理
三、Spring Validation 校驗處理 【校驗處理】三、Spring Validation 校驗處理
本篇文章采用第二種SpringBoot Validate 統一處理的驗證方式。話不多說,直接上代碼。
1. 原理
通過繼承`ResponseEntityExceptionHandler`這個類並實現`handleMethodArgumentNotValid`這個方法,就可以統一處理所以經過`Valid`注解過的接口
源碼地址:Github:https://github.com/lengrongfu/validate-common-demo
2. 依賴
注意:里面自帶了需要的校驗包hibernate-validator等
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
3. 測試實體類
@Data public class Test { public Test(){} @Length(min = 1,max = 5,message = "姓名長度應該在1-5之間") private String name; @Range(min = 1,max = 100,message = "年齡應該在1-100之間") private Integer age; @DecimalMax(value = "100.00",message = "體重有些超標哦") @DecimalMin(value = "60.00",message = "多吃點飯吧") private BigDecimal weight; @Future(message = "元素必須是一個將來的日期") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date date; @AssertTrue(message = "此值只能為true") private Boolean isuser; @Email(message = "郵箱地址無效") private String email; }
4. 配置類
public class ValidateCommonHandler extends ResponseEntityExceptionHandler { @Override protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status,WebRequest request) { for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) { String defaultMessage = fieldError.getDefaultMessage(); Object value = fieldError.getRejectedValue(); String data = "請求參數值為:"+ JSON.toJSONString(value); break; } return new ResponseEntity("", HttpStatus.OK); } }
5. 測試類
@ApiOperation("測試") @PostMapping("/test") public R test(@RequestBody @Valid Test test){ return R.ok(); } //參數Test內容如下: { "name":"張三張三張三", "age":"0", "weight":"110.00", "date":"2020-1-1 12:11:11", "isuser":"false", "email":"12345" }
6. 效果
7. 支持注解
8. 下面定義一個實體類,來大概描述每種注解的常見用法:(涉及到嵌套校驗)
@Data public class Student { @Length(min = 1,message = "姓名不能為空") @NotNull(message = "姓名不能為空") private String name; @NotNull(message = "年齡不能為空") @Min(value = 18,message = "年齡不能小於18歲") @Max(value = 56,message = "年齡不能大於56歲") private Integer age; @NotNull(message = "郵箱不能為空") @Email(message = "郵箱地址無效") private String email; @NotEmpty(message = "身份證號不能為空") @Pattern(regexp = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$",message = "請輸入正確的身份證號") private String idCard; @NotEmpty(message = "手機號碼不能為空") @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "請輸入正確的手機號碼") private String phone; @NotNull(message = "請輸入合法的時間") @Future(message = "請輸入合法的時間") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date inSchoolDate; @NotNull(message = "請輸入正確的銀行卡號") @CreditCardNumber(message = "請輸入正確的銀行卡號") private String backCard; //嵌套校驗 @NotEmpty(message = "請填寫女朋友信息") private List<@Valid Girlfriend> girlfriends; } @Data public class Girlfriend { @NotEmpty(message = "請輸入姓名") private String name; @NotNull(message = "請輸入年齡") @Range(min = 18,max = 24,message = "對不起,年齡不在合適的范圍內") private Integer age; @NotNull(message = "請輸入性別") @Digits(integer = 1,fraction = 0,message = "只接受女性為女朋友") private Integer gender; }
參考:
1. https://lengrongfu.github.io/2018/12/27/spring-validate-common-handler/
持續更新!!!