以@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("用户注册成功");
}
}