天天看點

Spring Boot 參數校驗及異常統一處理

1、@Validated參數校驗

【1】:實體類dto

package com.cc.common.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
import java.util.Set;

/**
 * 使用者入參dto
 * @author cc
 * @data 2021年06月29日 21:27
 */
@Data
public class UserDto {

    private Long id;

    @NotBlank(message = "姓名不可為空", groups = Set.class)
    private String name;

    @NotBlank(message = "密碼不可為空", groups = List.class)
    private String passWord;

    private String token;

}
           

【2】:Controller中

@Valid

表示這個實體參數交給Spring去校驗

@RequestMapping("/login")
public ReturnVo login(@RequestBody @Validated({Set.class, List.class}) UserDto dto){
    ReturnVo login = loginService.login(dto);
    return login;
}
           

【3】:校驗規則

注解 解釋
@Null 被注釋的元素必須為 null
@NotNull 被注釋的元素必須不為 null
@NotEmpty 驗證注解的元素值不為null且不為空(字元串長度不為0、集合大小不為0)
@NotBlank 驗證注解的元素值不為空(不為null并去除首尾位空格)
@AssertFalse 被注釋的元素必須為 false
@AssertTrue 被注釋的元素必須為 true
@DecimalMax(value) 被注釋的元素必須是一個數字,其值必須小于等于指定的最大值
@DecimalMin(value)  被注釋的元素必須是一個數字,其值必須大于等于指定的最小值
@Digits (integer, fraction) 被注釋的元素必須是一個數字,其值必須在可接受的範圍内
@Email 被注釋的元素必須是電子郵箱位址
@Future 被注釋的元素必須是一個将來的日期
@Past 限制必須是一個過去的日期
@Max(value) 被注釋的元素必須是一個數字,其值必須小于等于指定的最大值
@Min(value)  被注釋的元素必須是一個數字,其值必須大于等于指定的最小值
@Pattern(value) 限制必須符合指定的正規表達式
@Size(max,min) 限制字元長度必須在min到max之間

2、異常統一校驗

【1】:使用@ControllerAdvice和@ExceptionHandler注解, 注解@ControllerAdvice表示這是一個控制器增強類,當控制器發生異常且符合類中定義的攔截異常類,将會被攔截。

示例

package com.cc.common.component.exceptionHandler;

import com.cc.common.utils.ReturnVoUtil;
import com.cc.common.vo.ReturnVo;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;

/**
 * @author cc
 * @data 2021年07月03日 14:37
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 參數校驗統一傳回
     * @author cc
     * @date 2021/7/3 14:40
     */
    @ResponseBody
    @ExceptionHandler({MethodArgumentNotValidException.class})
    public ReturnVo parameterExceptionHandler(MethodArgumentNotValidException e){
        e.printStackTrace();
        StringBuffer msg = new StringBuffer();
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        for (FieldError fieldError : fieldErrors) {
            msg.append(fieldError.getDefaultMessage()).append(" ");
        }
        return ReturnVoUtil.error(msg.toString());
    }
}
           
Spring Boot 參數校驗及異常統一處理

【2】:使用ErrorController類來實作。具體不做講解。請自行百度

差別:

1.注解@ControllerAdvice方式隻能處理控制器抛出的異常。此時請求已經進入控制器中。

2.類ErrorController方式可以處理所有的異常,包括未進入控制器的錯誤,比如404,401等錯誤

3.如果應用中兩者共同存在,則@ControllerAdvice方式處理控制器抛出的異常,類ErrorController方式未進入控制器的異常。

[email protected]方式可以定義多個攔截方法,攔截不同的異常類,并且可以擷取抛出的異常資訊,自由度更大。

繼續閱讀