本文代码运行的环境:Spring Boot 版本:3.3.5,JDK 版本:17
第一步:引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
第二步:代码加校验注解
package org.allen.springboot3;import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Size;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;@RestController
@Validated
public class UserController {@PostMapping("/user")public User addUser(@RequestBody @Valid User user) {return user;}@GetMapping("/user")public User getUser(@RequestParam @Size(min = 3, message = "name长度不能小于3") String name,@RequestParam @Min(value = 1, message = "age不能小于1") Integer age) {User user = new User();user.setName(name);user.setAge(age);return user;}@GetMapping("/user/{name}")public User getUserDetail(@PathVariable @Size(min = 3, message = "name长度不能小于3") String name) {User user = new User();user.setName(name);return user;}
}
校验 @RequestParam
和 @PathVariable
参数要在 Contorller 类上加 @Validated
注解,校验 @RequestBody
参数要在参数前面加 @Valid
注解。
如果要对请求体参数 @RequestBody
校验,还需要在对应的类上加注解:
package org.allen.springboot3;import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;public class User {@NotBlank(message = "name不能为空")private String name;@Min(value = 1, message = "age不能小于1")private Integer age;
}
第三步:将异常按统一格式封装
package org.allen.springboot3;import jakarta.validation.ConstraintViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.Map;@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<CommonResult> handleValidationExceptions(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();ex.getBindingResult().getAllErrors().forEach((error) -> {String fieldName = ((FieldError) error).getField();String errorMessage = error.getDefaultMessage();errors.put(fieldName, errorMessage);});CommonResult result = new CommonResult(1, "参数校验失败", errors);return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);}@ExceptionHandler(ConstraintViolationException.class)ResponseEntity<CommonResult> handleConstraintViolationException(ConstraintViolationException e) {CommonResult result = new CommonResult(1, "参数校验失败", e.getMessage());return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);}
}
MethodArgumentNotValidException
是校验 RequestBody
参数的异常,ConstraintViolationException
是校验 @RequestParam
和 @PathVariable
参数的异常。
参考
- JavaGuide 公众号文章:如何在 Spring/Spring Boot 中做参数校验?你需要了解的都在这里!