Spring Boot—13、Validation

本文介绍如何在Spring Boot项目中实现参数校验,包括使用@Validated、自定义异常处理及常见验证注解。通过示例展示了Controller、Vo类及全局异常处理的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码地址:https://github.com/huiyiwu/spring-boot-simple/spring-boot-validated

Spring Boot 版本小于 2.3.x,spring-boot-starter-web 会自动引入 hibernate-validator 的依赖。如果 Spring Boot 版本大于 2.3.x,则需要手动引入依赖:

<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.5.Final</version>
</dependency>

1. Controller类:

ValidatedController.java:

/**
 * Author: Huchx
 * Date: 2021/1/25 9:38
 */
@RestController
public class ValidatedController {
    @RequestMapping(value = "/validate", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
    public String validated(@Validated UserVo userVo){
        return "Validated Success";
    }
}

2. Vo类

UserVo.java:

/**
 * Author: Huchx
 * Date: 2021/1/25 9:43
 */
public class UserVo  implements Serializable {
    public interface Default {
    }

    public interface Group1 {
    }

    @NotBlank(message = "userName不能为空")
    private String userName;
    @Max(value = 150,message = "年龄不能超过150")
    @Min(value = 18,message = "最小年龄不能小于18")
    private int age;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

3. 全局异常捕获

GlobalExceptionHandler.java:

/**
 * Author: Huchx
 * Date: 2021/1/25 9:48
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 使用Post方式请求,RequetBody接收时捕获
     * @param exception
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) {
        StringBuilder errorInfo = new StringBuilder();
        BindingResult bindingResult = exception.getBindingResult();
        for(int i = 0; i < bindingResult.getFieldErrors().size(); i++){
            if(i > 0){
                errorInfo.append(",");
            }
            FieldError fieldError = bindingResult.getFieldErrors().get(i);
            errorInfo.append(fieldError.getField()).append(" :").append(fieldError.getDefaultMessage());
        }

        Map errResult = new HashMap();
        errResult.put("message",errorInfo.toString());
        errResult.put("code",500);
        return errResult;
    }


    @ExceptionHandler(ConstraintViolationException.class)
    public Map handleConstraintViolationException(ConstraintViolationException exception) {
        StringBuilder msg = new StringBuilder();
        Set<ConstraintViolation<?>> constraintViolations = exception.getConstraintViolations();
        for (ConstraintViolation<?> constraintViolation : constraintViolations) {
            PathImpl pathImpl = (PathImpl) constraintViolation.getPropertyPath();
            String paramName = pathImpl.getLeafNode().getName();
            String message = constraintViolation.getMessage();
            msg.append("[").append(message).append("]");
        }

        Map errResult = new HashMap();
        errResult.put("message",msg);
        errResult.put("code",501);
        return errResult;
    }

    /**
     *使用Post方式,但不用JSON方式提交时捕获
     * @param e
     * @param request
     * @return
     */
    @ExceptionHandler(BindException.class)
    public Map exceptionHandler(BindException e, HttpServletRequest request) {
        String failMsg = e.getBindingResult().getFieldError().getDefaultMessage();
        Map errResult = new HashMap();
        errResult.put("message",failMsg);
        errResult.put("code",502);
        return errResult;
    }

    @ExceptionHandler(Exception.class)
    public Map handleDefaultException(Exception exception) {
        Map errResult = new HashMap();
        errResult.put("message",exception.getMessage());
        errResult.put("code",503);
        return errResult;
    }
}

4. 测试

在PostMan中测试:
Post Params
Post RequestBody

7. 字段验证注解

字段描述
@Null限制只能为null
@NotNull限制必须不为null
@AssertFalse限制必须为false
@AssertTrue限制必须为true
@DecimalMax(value)限制必须为一个不大于指定值的数字
@DecimalMin(value)限制必须为一个不小于指定值的数字
@Digits(integer,fraction)限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future限制必须是一个将来的日期
@Max(value)限制必须为一个不大于指定值的数字
@Min(value)限制必须为一个不小于指定值的数字
@Past限制必须是一个过去的日期
@Pattern(value)限制必须符合指定的正则表达式
@Size(max,min)限制字符长度必须在min到max之间
@Past验证注解的元素值(日期类型)比当前时间早
@NotEmpty验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank
@Email验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值