SpringBoot校驗器+全局異常處理,完美解決前端傳參校驗問題

SpringBoot校驗器+全局異常處理,完美解決前端傳參校驗問題

本文主要內容

1.實現參數校驗功能

2.全局異常處理器處理參數校驗異常

3.測試效果展示

為了避免在controller陷入if/else代碼的折磨,推薦使用SpringBoot的校驗器功能,廢話不多,咱擼起袖子就是幹^-^。本文只是介紹使用基礎的校驗器,如果想自定義校驗器可以參照

實現參數校驗功能

1.引入jar包

<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-validation/<artifactid>
/<dependency>

2.定義實現類

2.1 、controller層代碼

import com.example.demo.dto.UserDto;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/addUser",method = RequestMethod.POST)
public Object addUser(@RequestBody @Valid UserDto userDto){
return userDto;

}
@RequestMapping(value = "/getUser",method = RequestMethod.GET)
public Object getUser(@Valid UserDto userDto){
return userDto;
}
}

2.2、DTO類的定義

import com.example.demo.annotation.IsMobileNo;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotNull;
@Data
public class UserDto {
@NotNull(message = "用戶名不能為空")
private String userName;
@NotNull
@Length(min=8,message = "密碼長度不能少於8")
private String password;
}

經過已上幾步,我們就輕鬆地完成springBoot參數校驗的功能,但是一個現在處於一個前後端分離的時代,僅僅這樣對用戶會顯得格外的不友好,這時我們需要引入一個全局的異常處理器來給用戶返回用戶可以看懂的提示語,下面我們將完成全局處理器的功能

全局異常處理器處理參數校驗異常

import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public Object exceptionHandler(HttpServletRequest request,Exception e){
if(e instanceof MethodArgumentNotValidException){

MethodArgumentNotValidException ex =
(MethodArgumentNotValidException) e;
BindingResult bindingResult = ex.getBindingResult();
String msg = handlerErrors(bindingResult);
return msg;
}else if(e instanceof BindException){

BindException ex = (BindException) e;
BindingResult bindingResult = ex.getBindingResult();
String msg = handlerErrors(bindingResult);
return msg;
}
return null;
}

private String handlerErrors(BindingResult bindingResult){
List<objecterror> errors = bindingResult.getAllErrors();
ObjectError error = errors.get(0);
String msg = error.getDefaultMessage();
return msg;
}
}
/<objecterror>

為啥需要兩個異常類型呢?MethodArgumentNotValidException異常是@RequestBody 和@Valid校驗參數不合格時拋的異常,BindException異常是@Valid校驗參數不合格時拋的異常,所以需要對這兩種異常進行處理。

測試效果演示

1.GET方法演示

SpringBoot校驗器+全局異常處理,完美解決前端傳參校驗問題

GET方法演示

2.POST方法演示

SpringBoot校驗器+全局異常處理,完美解決前端傳參校驗問題

POST方法演示


分享到:


相關文章: