以@NotBlank为例,当前端传递过来的参数全为空格时:
1.编写全局异常处理器
假设有一个控制器(Controller)方法,该方法接受一个用户注册的请求,并期望接收用户名和密码作为参数。想要确保这两个参数不能为空或只包含空格。
- @RestController
- public class UserController {
-
- @PostMapping("/register")
- public ResponseEntity
registerUser( - @NotBlank(message = "用户名不能为空或只包含空格") @RequestParam("username") String username,
- @NotBlank(message = "密码不能为空或只包含空格") @RequestParam("password") String password) {
-
- // 在这里处理用户注册逻辑,例如将用户信息保存到数据库
-
- return ResponseEntity.ok("用户注册成功");
- }
- }
在上面的示例中,@NotBlank注解用于确保username和password参数不能为空或只包含空格。如果前端发送一个请求,其中username或password为空或只包含空格,Spring Boot将抛出MethodArgumentNotValidException异常。
要处理这个异常并返回友好的错误消息给前端,可以创建一个全局异常处理器(Global Exception Handler):
- @ControllerAdvice
- public class GlobalExceptionHandler {
-
- @ExceptionHandler(MethodArgumentNotValidException.class)
- public ResponseEntity
handleValidationException(MethodArgumentNotValidException ex) { - // 从异常中获取校验错误信息
- String errorMessage = ex.getBindingResult().getFieldError().getDefaultMessage();
- return ResponseEntity.badRequest().body(errorMessage);
- }
- }
在这个全局异常处理器中,我们捕获了MethodArgumentNotValidException异常,并从异常中提取校验错误信息,然后将错误信息封装到响应中返回给前端。
现在,如果前端发送一个请求,其中包含空白的用户名或密码,后端会捕获并返回如下错误响应:
- {
- "timestamp": "2023-09-24T12:00:00",
- "status": 400,
- "error": "Bad Request",
- "message": "用户名不能为空或只包含空格"
- }
2.手动校验参数
在方法内部手动检查参数,如果不满足条件,则抛出自定义异常并在方法内部进行捕获和处理。
- @RestController
- public class UserController {
-
- @PostMapping("/register")
- public ResponseEntity
registerUser( - @RequestParam("username") String username,
- @RequestParam("password") String password) {
-
- if (username == null || username.trim().isEmpty()) {
- throw new CustomValidationException("用户名不能为空或只包含空格");
- }
-
- if (password == null || password.trim().isEmpty()) {
- throw new CustomValidationException("密码不能为空或只包含空格");
- }
-
- // 在这里处理用户注册逻辑,例如将用户信息保存到数据库
- return ResponseEntity.ok("用户注册成功");
- }
- }
3.使用自定义注解和拦截器
还可以创建自定义注解和拦截器来实现参数的自定义校验逻辑。这种方式更加灵活,可以在请求处理之前拦截请求并进行校验。
- @Target(ElementType.PARAMETER)
- @Retention(RetentionPolicy.RUNTIME)
- @Constraint(validatedBy = CustomValidator.class)
- public @interface CustomValidation {
- String message() default "Invalid parameter";
- Class>[] groups() default {};
- Class extends Payload>[] payload() default {};
- }
-
- public class CustomValidator implements ConstraintValidator
{ - @Override
- public boolean isValid(String value, ConstraintValidatorContext context) {
- return value != null && !value.trim().isEmpty();
- }
- }
-
- @RestController
- public class UserController {
-
- @PostMapping("/register")
- public ResponseEntity
registerUser( - @CustomValidation(message = "用户名不能为空或只包含空格") @RequestParam("username") String username,
- @CustomValidation(message = "密码不能为空或只包含空格") @RequestParam("password") String password) {
-
- // 在这里处理用户注册逻辑,例如将用户信息保存到数据库
- return ResponseEntity.ok("用户注册成功");
- }
- }