【校驗處理】二、SpringBoot Validate 統一處理


在真實的開發中,我們經常會遇到需要對數據進行校驗的業務,那么本篇文章對此進行總結。暫時總結三種方法,大家可以根據需要選擇使用。

一、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/

持續更新!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM