• springboot项目controller方法参数校验异常处理


    以@NotBlank为例,当前端传递过来的参数全为空格时:

    1.编写全局异常处理器

    假设有一个控制器(Controller)方法,该方法接受一个用户注册的请求,并期望接收用户名和密码作为参数。想要确保这两个参数不能为空或只包含空格。

    1. @RestController
    2. public class UserController {
    3. @PostMapping("/register")
    4. public ResponseEntity registerUser(
    5. @NotBlank(message = "用户名不能为空或只包含空格") @RequestParam("username") String username,
    6. @NotBlank(message = "密码不能为空或只包含空格") @RequestParam("password") String password) {
    7. // 在这里处理用户注册逻辑,例如将用户信息保存到数据库
    8. return ResponseEntity.ok("用户注册成功");
    9. }
    10. }

    在上面的示例中,@NotBlank注解用于确保usernamepassword参数不能为空或只包含空格。如果前端发送一个请求,其中usernamepassword为空或只包含空格,Spring Boot将抛出MethodArgumentNotValidException异常。

    要处理这个异常并返回友好的错误消息给前端,可以创建一个全局异常处理器(Global Exception Handler):

    1. @ControllerAdvice
    2. public class GlobalExceptionHandler {
    3. @ExceptionHandler(MethodArgumentNotValidException.class)
    4. public ResponseEntity handleValidationException(MethodArgumentNotValidException ex) {
    5. // 从异常中获取校验错误信息
    6. String errorMessage = ex.getBindingResult().getFieldError().getDefaultMessage();
    7. return ResponseEntity.badRequest().body(errorMessage);
    8. }
    9. }

    在这个全局异常处理器中,我们捕获了MethodArgumentNotValidException异常,并从异常中提取校验错误信息,然后将错误信息封装到响应中返回给前端。

    现在,如果前端发送一个请求,其中包含空白的用户名或密码,后端会捕获并返回如下错误响应:

    1. {
    2. "timestamp": "2023-09-24T12:00:00",
    3. "status": 400,
    4. "error": "Bad Request",
    5. "message": "用户名不能为空或只包含空格"
    6. }

    2.手动校验参数

    在方法内部手动检查参数,如果不满足条件,则抛出自定义异常并在方法内部进行捕获和处理。

    1. @RestController
    2. public class UserController {
    3. @PostMapping("/register")
    4. public ResponseEntity registerUser(
    5. @RequestParam("username") String username,
    6. @RequestParam("password") String password) {
    7. if (username == null || username.trim().isEmpty()) {
    8. throw new CustomValidationException("用户名不能为空或只包含空格");
    9. }
    10. if (password == null || password.trim().isEmpty()) {
    11. throw new CustomValidationException("密码不能为空或只包含空格");
    12. }
    13. // 在这里处理用户注册逻辑,例如将用户信息保存到数据库
    14. return ResponseEntity.ok("用户注册成功");
    15. }
    16. }

    3.使用自定义注解和拦截器

    还可以创建自定义注解和拦截器来实现参数的自定义校验逻辑。这种方式更加灵活,可以在请求处理之前拦截请求并进行校验。

    1. @Target(ElementType.PARAMETER)
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Constraint(validatedBy = CustomValidator.class)
    4. public @interface CustomValidation {
    5. String message() default "Invalid parameter";
    6. Class[] groups() default {};
    7. Classextends Payload>[] payload() default {};
    8. }
    9. public class CustomValidator implements ConstraintValidator {
    10. @Override
    11. public boolean isValid(String value, ConstraintValidatorContext context) {
    12. return value != null && !value.trim().isEmpty();
    13. }
    14. }
    15. @RestController
    16. public class UserController {
    17. @PostMapping("/register")
    18. public ResponseEntity registerUser(
    19. @CustomValidation(message = "用户名不能为空或只包含空格") @RequestParam("username") String username,
    20. @CustomValidation(message = "密码不能为空或只包含空格") @RequestParam("password") String password) {
    21. // 在这里处理用户注册逻辑,例如将用户信息保存到数据库
    22. return ResponseEntity.ok("用户注册成功");
    23. }
    24. }

  • 相关阅读:
    TAO 训练时遇到 docker报错
    读书记录 《你想活出怎样的人生》
    mySQL—索引
    多线设置教程
    【web-攻击后端组件】(7.1)注入操作系统命令:Perl、ASP、动态执行、OS命令注入
    lua vm 二: 查看字节码、看懂字节码
    package.json属性
    C#语法糖系列 —— 第一篇:聊聊 params 参数底层玩法
    Linux使用手册(自用)
    前端之一阶段[HTML、CSS]问题记录
  • 原文地址:https://blog.csdn.net/okfineyell/article/details/133251406