Springboot:参数校验

发布于 2021-09-17  885 次阅读


2023年3月23日16:01:53更新:校验异常捕获,全局返回异常信息

    @ExceptionHandler({ConstraintViolationException.class, MethodArgumentNotValidException.class})
    public void handleViolationExceptionError(
            HttpServletRequest request,
            HttpServletResponse response,
            ConstraintViolationException exception
    ) throws IOException {
        String query = request.getQueryString();
        String url = Strings.isNullOrEmpty(query)
                ? request.getRequestURL().toString()
                : request.getRequestURL() + "?" + query;
        log.error(String.format("参数错误, method: %s, url: %s", request.getMethod(), url), exception);
        response.setStatus(HttpStatus.OK.value());
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        var msg = "参数校验错误,请检查后重试!原因:" + exception.getMessage();
        var res = RGenerator.resCustom(HttpStatus.INTERNAL_SERVER_ERROR.value(), msg); // 此处为自定义的返回对象
        var result = JsonUtils.toJson(res).getBytes(StandardCharsets.UTF_8);
        response.getOutputStream().write(result);
    }
  • @AssertFalse 所注解的元素必须是Boolean类型,且值为false
  • @AssertTrue 所注解的元素必须是Boolean类型,且值为true
  • @DecimalMax 所注解的元素必须是数字,且值小于等于给定的值
  • @DecimalMin 所注解的元素必须是数字,且值大于等于给定的值
  • @Digits 所注解的元素必须是数字,且值必须是指定的位数
  • @Future 所注解的元素必须是将来某个日期
  • @Max 所注解的元素必须是数字,且值小于等于给定的值
  • @Min 所注解的元素必须是数字,且值小于等于给定的值
  • @Range 所注解的元素需在指定范围区间内
  • @NotNull 所注解的元素值不能为null
  • @NotBlank 所注解的元素值有内容
  • @Null 所注解的元素值为null
  • @Past 所注解的元素必须是某个过去的日期
  • @PastOrPresent 所注解的元素必须是过去某个或现在日期
  • @Pattern 所注解的元素必须满足给定的正则表达式
  • @Size 所注解的元素必须是String、集合或数组,且长度大小需保证在给定范围之内
  • @Email 所注解的元素需满足Email格式
//单参数校验
@RestController
@Validated
public class PingController {

    @GetMapping("/getUser")
    public String getUserStr(@NotNull(message = "name 不能为空") String name,
                             @Max(value = 99, message = "不能大于99岁") Integer age) {
        return "name: " + name + " ,age:" + age;
    }
}

//请求
http://localhost:8080/getUser?name=Allan&age=101

//结果
{
    "timestamp": "2019-06-01T04:30:26.882+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "getUserStr.age: 不能大于99岁",
    "path": "/getUser"
}
//实体类校验
@Data
public class UserInfo {
    @NotNull(message = "username cannot be null")
    private String name;

    @NotNull(message = "sex cannot be null")
    private String sex;

    @Max(value = 99L)
    private Integer age;
}

    @PostMapping("/getUser")
public String getUserStr(@RequestBody @Validated({GroupA.class, Default.class}) UserInfo user, BindingResult bindingResult) {
        validData(bindingResult);
        return "name: " + user.getName() + ", age:" + user.getAge();
}

2021年11月19日09:59:21补充

依赖:校验依赖hibernate,所以要引入相关依赖才可以用

        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.1.7.Final</version>
        </dependency>

统一异常处理

    /**
     * 获取校验错误提示,统一异常处理
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public String handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        log.error(e.getMessage(), e);
        return e.getBindingResult().getFieldError().getDefaultMessage();
    }

实体类校验

实体类


@Data
public class Entity {
    @NotBlank(message = "name不能为空")
    private String name;

    public Entity(@NotBlank(message = "不能为空") String name) {
        this.name = name;
    }

    public Entity() {
    }
}
    @PostMapping("/test")
    public String test(@Validated @RequestBody Entity entity){
        System.out.println(entity);
        return "ok";
    }

参考:https://www.cnblogs.com/mooba/p/11276062.html


欢迎欢迎~热烈欢迎~