JSR303校验

JSR303是JavaEE6中的BeanValidation规范,用于进行数据校验,如非空、长度、精度等。HibernateValidator是其参考实现,提供内置约束的实现。ValidationExceptionAdvice是SpringBoot中处理校验异常的方法,当校验失败时,返回包含错误信息的结果。文章还展示了如何在DTO类中添加注解进行校验以及定义Result类来封装返回结果。
摘要由CSDN通过智能技术生成

1、什么是JSR303校验

JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。 JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint(约束) 的实现,除此之外还有一些附加的 constraint。

JSR303是用于做参数校验的。前端发送到后台的参数,需要校验,比如不能为空、长度、精度等,JSR303可以帮助我们实现。

2、添加ValidationExceptionAdvice

import com.wztsl.springboo.vo.Result;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
​
import java.util.HashMap;
import java.util.List;
import java.util.Map;
​
/**
 * @author szsw
 * @date 2023/2/3 18:15:01
 */
@RestControllerAdvice("com.wztsl.springboo.controller")
public class ValidationExceptionAdvice {
​
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Result handleValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        Map<String, String> map = new HashMap<>();
        if (!CollectionUtils.isEmpty(fieldErrors)) {
            for (FieldError fieldError : fieldErrors) {
                map.put(fieldError.getField(), fieldError.getDefaultMessage());
            }
        }
        return Result.error().put("data", map);
    }
}

3、ctrl中需要校验的参数类中添加注解

空检查
@Null验证对象是否为null
@NotNull验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank检查约束字符串是不是Null还有被Trim的长度是否大于0
@NotEmpty检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue验证 Boolean 对象是否为 true
@AssertFalse验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=)验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=)验证字符串长度
日期检查
@Past验证 Date 和 Calendar 对象是否在当前时间之前
@Future验证 Date 和 Calendar 对象是否在当前时间之后
数值检查建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min验证 Number 和 String 对象是否大等于指定的值
@Max验证 Number 和 String 对象是否小等于指定的值
@Digits(Integer=,fraction=,message=“”)浮点型校验,Integer代表整数位数,fraction代表小数位数
格式检查
@Pattern验证 String 对象是否符合正则表达式的规则

Result

import lombok.Data;
​
import java.util.HashMap;
import java.util.Map;
​
import static com.wztsl.springboo.contants.ResultCode.ERROR;
import static com.wztsl.springboo.contants.ResultCode.SUCCESS;
​
/**
 * @author szsw
 * @date 2023/2/3 18:18:15
 */
@Data
public class Result {
​
    private Integer code;
​
    private String message;
​
    private Map<String, Object> map = new HashMap<>();
​
    private Result() {
    }
​
    public static Result ok() {
        Result r = new Result();
        r.setCode(SUCCESS.getCode());
        r.setMessage(SUCCESS.getMessage());
        return r;
    }
​
    public static Result error() {
        Result r = new Result();
        r.setCode(ERROR.getCode());
        r.setMessage(ERROR.getMessage());
        return r;
    }
​
    public Result put(String key, Object value) {
        map.put(key, value);
        return this;
    }
​
    public Object get(String key) {
        return map.get(key);
    }
​
}

ResultCode

/**
 * @author szsw
 * @date 2023/2/3 18:26:03
 */
public enum ResultCode {
​
    /**
     *
     */
    SUCCESS(0, "请求成功"),
    ERROR(1, "请求失败"),
    ;
​
    private int code;
    private String message;
​
    ResultCode(int code, String message) {
        this.code = code;
        this.message = message;
    }
​
    public int getCode() {
        return code;
    }
​
    public String getMessage() {
        return message;
    }
}

Ctrl

import com.wztsl.springboo.dto.StartDto;
import com.wztsl.springboo.vo.Result;
import org.springframework.web.bind.annotation.*;
​
import javax.validation.Valid;
import java.util.HashMap;
import java.util.Map;
​
/**
 * @author szsw
 * @date 2023/1/17 14:30:46
 */
@RestController
@RequestMapping("/start")
public class StartController {
​
​
    @GetMapping("/test")
    @SuppressWarnings("java:S106")
    public Result test() {
        Map<String, Object> result = new HashMap<>();
        result.put("a", 1);
        result.put("b", 2);
        result.put("c", 3);
        result.put("d", 4);
        System.out.println("I am 01");
        return Result.ok().put("data", result);
    }
​
    @PostMapping("/add")
    public Result add(@Valid @RequestBody StartDto startDto) {
        return Result.ok();
    }
​
}

Dto

import lombok.Data;
import org.hibernate.validator.constraints.Length;
​
import javax.validation.constraints.NotEmpty;
​
/**
 * @author szsw
 * @date 2023/2/3 18:42:18
 */
@Data
public class StartDto {
​
    @NotEmpty(message = "用户名不能为空")
    private String username;
    @Length(min = 8, max = 16, message = "密码长度为8~16位")
    private String password;
​
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值