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) | 被注釋的元素必須是一個數字,其值必須在可接受的範圍内 |
被注釋的元素必須是電子郵箱位址 | |
@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());
}
}
【2】:使用ErrorController類來實作。具體不做講解。請自行百度
差別:
1.注解@ControllerAdvice方式隻能處理控制器抛出的異常。此時請求已經進入控制器中。
2.類ErrorController方式可以處理所有的異常,包括未進入控制器的錯誤,比如404,401等錯誤
3.如果應用中兩者共同存在,則@ControllerAdvice方式處理控制器抛出的異常,類ErrorController方式未進入控制器的異常。
[email protected]方式可以定義多個攔截方法,攔截不同的異常類,并且可以擷取抛出的異常資訊,自由度更大。