• 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. }

  • 相关阅读:
    链接服务器查询导致的阻塞
    GET方式请求参数中文乱码问题 [JavaWeb][Servlet]
    软件测试 -- 入门 4 软件测试原则
    引用计数法
    为什么吃奶粉的宝宝比吃母乳宝宝更胖?
    【数据库问题】删除数据库失败,提示:there is 1 other session using the database
    MybatisPlus
    (6)Mybatis-plus DML编程控制
    UNIAPP实战项目笔记29 购物车设置自定义导航栏
    redis最佳实践
  • 原文地址:https://blog.csdn.net/okfineyell/article/details/133251406