如何使用springboot优雅地校验请求参数

描述

通常我们编写一个接口,参数校验这一步是必不可少的,如果传递的参数不符合规范,那么不应该进入到业务方法应该将不合法信息提示给前端。对于参数校验传统的做法是,每个接口在接收到参数后再手动判断是否合法,这样一来每个接口都要手动编写验证规则,很明显这部分工作可以独立出来做统一验证。

springboot的参数验证

为解决上述问题,springboot本身提供了一个验证框架。

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

值得注意的是,在springboot2.3.x版本以后将这个依赖移除了,所以2.3以后的版本请手动添加,2.3以下的版本则不需要自己添加。

定义参数接受类并添加验证规则

import lombok.Data;
import lombok.ToString;

import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;

@Data
@ToString
public class User {
    @NotEmpty(message = "姓名不能为空")
    private String username;

    @Min(value = 1 , message = "年龄不能小于1岁")
    @Max(value = 100 , message = "年龄不能大于100岁")
    private Integer age;

    @Email
    @NotEmpty(message = "邮箱不能为空")
    private String email;

    @NotEmpty(message = "地址不能为空")
    private String address;
}

springboot的验证框架提供了一系列的注解用于验证参数,完整的注解可以去javax.validation.constraints这个包下看。这里整理一下:

注解说明
@AssertFalse被注释的元素必须为 false
@AssertTrue被注释的元素必须为 true
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min)被注释的元素的大小必须在指定的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
@Pattern(value)被注释的元素必须符合指定的正则表达式

定义一个controller来暴露接口

@RestController
public class UserController {

    @PostMapping("/save")
    public Result save(@RequestBody @Validated User user) {
        return Result.success(user.toString());
    }
}

接受参数User user添加@Validated注解,这样上面定义的规则才会生效。

给controller添加一个增强器

目的是为了拦截参数校验失败后的异常,然后统一结构返回。

@Slf4j
@RestControllerAdvice
public class ControllerAdvice {

    /**
     * 拦截表单参数校验
     * @param e
     * @return
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler({BindException.class})
    public Result bindException(BindException e) {
        BindingResult bindingResult = e.getBindingResult();
        String msg = Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage();
        log.error("参数校验异常拦截:{}", msg);
        return Result.error(msg);
    }

    /**
     * 拦截JSON参数校验
     * @param e
     * @return
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result bindException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        String msg = Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage();
        log.error("参数校验异常拦截:{}", msg);
        return Result.error(msg);
    }

}

github地址:https://github.com/stryang/springboot/tree/master/spring-validated
展示部分效果如图
在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 中,可以使用 Hibernate Validator 来进行请求参数校验。具体步骤如下: 1. 引入 Hibernate Validator 依赖: ```xml <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.5.Final</version> </dependency> ``` 2. 在需要校验请求参数实体类中添加校验注解,例如: ```java public class User { @NotBlank(message = "用户名不能为空") private String username; @NotBlank(message = "密码不能为空") private String password; @Email(message = "邮箱格式不正确") private String email; // 省略 getter 和 setter 方法 } ``` 3. 在请求处理方法中添加 @Validated 注解,并在参数上添加 @Valid 注解,例如: ```java @RestController @RequestMapping("/user") @Validated public class UserController { @PostMapping("/login") public Result login(@RequestBody @Valid User user) { // 处理登录逻辑 } } ``` 4. 当请求参数不符合校验规则时,会抛出 ConstraintViolationException 异常。可以在全局异常处理器中对该异常进行处理,例如: ```java @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ConstraintViolationException.class) public Result handleConstraintViolationException(ConstraintViolationException e) { List<String> errorMessages = e.getConstraintViolations().stream() .map(ConstraintViolation::getMessage) .collect(Collectors.toList()); return Result.error(String.join(",", errorMessages)); } } ``` 这样就可以自定义请求参数校验了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值