资讯详情

数据校验 JSR303校验

一、验证要求

检查前端传输的数据合法性。

二、验证方法

1.1 定义

在业务成对request非空判断中的参数。

1.2 举例

Stu.java

@Data @EqualsAndHashCode(callSuper = false) public class Stu implements Serializable {     private static final long serialVersionUID = 1L;      @TableId(value = "id",type = IdType.AUTO)     private int id;     private String name;     private int age;     private String gender;     private String address;     private Date birth; }

StuServiceImpl.java

@Service public class StuServiceImpl extends ServiceImpl<StuMapper, Stu> implements StuServiceI {     @Override     public Result add(Stu stu) {         if(stu.getName()==null){             return Result.fail("学生名不能为空");         }         if(stu.getAddress()==null){             return Result.fail("学生地址不能为空");         }         this.save(stu);         return Result.success();     } }

1.3 缺点

若实体类字段较多,不易维护,给业务层增加负担。

2.1 定义

声明校验,又称JSR303校验。

JRS303是Java为Bean数据合法性验证提供的标准框架,JSR303通过在Bean类似于属性上注@NotNull、@NotBlank实现数据合法性验证。

2.2 相关注解

注解 功能
@Null 验证对象是否为 null
@NotNull 验证对象是否不是 null
@AssertTrue 验证 Boolean 对象是否为 true
@AssertTrue 验证 Boolean 对象是否为 false
@Max(value) 验证 Number 和 String 对象是否小于指定值
@Min(value) 验证 Number 和 String 对象是否大于指定值
@DecimalMax(value) 验证注释的元素值小于或等于 @DecimalMax 指定的 value 值
@DecimalMin(value) 验证注释的元素值大于或等于 @DecimalMin 指定的 value 值
@Digits(integer,fraction) 验证字符串是否符合指定格式,integer 指定整数精度,fraction 指定小数精度
@Size(min,max) 验证对象长度是否在给定范围内
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式规则
@NotBlank 检查字符串是不是 Null,被 Trim 是否长度大于0,只对字符串,前后空格会去除
@URL 验证是否合法 url
@CreditCardNumber 验证信用卡号是否合法

2.3 Hibernate Validator 扩展注解

注解 功能
@Email 验证邮箱是否合法
@Length(min,max) 验证字符串的长度必须在指定范围内
@NotEmpty 检查元素是否为 Null 或 Empty
@Range(min,max,message) 必须在适当的范围内验证属性值

2.4 示例代码

2.4.1 pom.xml

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

注意:validation 启动依赖里 包含jakarta:el:3.0.4.jar 和hibernate-validator:6.1.7.Final.jar

2.4.2 实体类Stu.java

@Data @EqualsAndHashCode(callSuper = false) public class Stu implements Serializable {     private static final long serialVersionUID = 1L;      @TableId(value = "id",type = IdType.AUTO)     private int id;     @NotBlank(message = "名字不能为空")     @Length(max = 20, message = "用户名的长度不得超过20")     private String name;     private int age;     private String gender;     @NotBlank(message = "性别不能为空")     private String address;     private Date birth; }

2.4.3 控制层StuController.java

使用@Valid注解。

如果要分组验证,可以使用@Validated这里不演示注释。

@RestController @RequestMapping("/stu") public class StuController {     @Resource     private StuServiceI stuService;      @PostMapping     public Result add(@Valid @RequestBody Stu stu){        stuService.save(stu);
        return Result.success("新增成功");
    }
}

2.4.4 全局异常处理ExceptionCatch.java

        数据合法校验的异常是MethodArgumentNotValidException,多个数据合法校验异常,只提示用户第一个。

@RestControllerAdvice
public class ExceptionCatch {

    private static ImmutableMap.Builder<Class<? extends Exception>,ExceptionResult> builder = ImmutableMap.builder();
    /**
     * 自定义异常处理
     * @param e
     * @return
     */
    @ExceptionHandler(CustomException.class)
    public ResponseResult handlerRuntimeException(CustomException e){
        ExceptionResult result = e.getExceptionResult();
        return ResponseResult.fail(result.retCode(),result.retMsg());
    }

    @ExceptionHandler(value= MethodArgumentNotValidException.class)
    public ResponseResult validateException(MethodArgumentNotValidException e){
        BindingResult bindingResult=e.getBindingResult();
        Map<String,Object> map=new HashMap<>();
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        //bindingResult.getFieldErrors().forEach(exption->{
        //    map.put(exption.getField(),exption.getDefaultMessage());
        //
        //});
        FieldError fieldError = fieldErrors.get(0);
        map.put("field",fieldError.getField());
        map.put("msg",fieldError.getDefaultMessage());
        return ResponseResult.fail("数据校验异常",map);

    }
    /**
     * 其他异常处理
     *          除运行时异常以外的异常
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public ResponseResult handlerException(Exception e){
        ExceptionResult result = builder.build().get(e.getClass());
        if(ObjectUtil.isNotNull(result)){
            return ResponseResult.fail(result.retCode(),result.retMsg());
        }
        return ResponseResult.fail(e.getMessage());
    }
}

2.5 测试

标签: jrs1ds过载继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台