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

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

1.编写全局异常处理器

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

@RestController
public class UserController {

    @PostMapping("/register")
    public ResponseEntity<String> registerUser(
            @NotBlank(message = "用户名不能为空或只包含空格") @RequestParam("username") String username,
            @NotBlank(message = "密码不能为空或只包含空格") @RequestParam("password") String password) {
        
        // 在这里处理用户注册逻辑,例如将用户信息保存到数据库

        return ResponseEntity.ok("用户注册成功");
    }
}

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

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

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> 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<String> 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<CustomValidation, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value != null && !value.trim().isEmpty();
    }
}

@RestController
public class UserController {

    @PostMapping("/register")
    public ResponseEntity<String> registerUser(
            @CustomValidation(message = "用户名不能为空或只包含空格") @RequestParam("username") String username,
            @CustomValidation(message = "密码不能为空或只包含空格") @RequestParam("password") String password) {

        // 在这里处理用户注册逻辑,例如将用户信息保存到数据库
        return ResponseEntity.ok("用户注册成功");
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值