@Validated 前端表单数据校验

作者 : admin 本文共4103个字,预计阅读时间需要11分钟 发布时间: 2024-06-8 共3人阅读

1. 整合

1.1 依赖引入

        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>

1.2 控制层

    /**
     * 新增胎架计划
     *
     * @param subsectionPlanVo
     * @return
     */
    @PostMapping("/schedule")
    @ApiOperation("新增胎架计划")
    public R saveSchedule(@Valid @RequestBody SubsectionPlanVo subsectionPlanVo) {
        subsectionPlanService.saveSubsectionPlan(subsectionPlanVo);
        return R.ok();
    }

1.3 Vo数据类结构

package com.gkdz.server.modules.shelves.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * 胎架计划
 */
@Data
public class SubsectionPlanVo {
	@NotBlank(message = "分段id不能为空")
	private String shipSegmentId;
    //状态
    @NotNull(message = "变更状态不能为空")
    private Integer states;
    @NotNull(message = "坐标x不能为空")
    private double x;
    @NotNull(message = "坐标y不能为空")
    private double y;
}

1.4 数据异常处理

package com.imooc.exceptions;
import com.imooc.grace.result.GraceJSONResult;
import com.imooc.grace.result.ResponseStatusEnum;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.UnsupportedJwtException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.security.SignatureException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 全局异常处理,本质为切面
*
* 注解ExceptionHandler为切入点
*/
@ControllerAdvice
public class GraceExceptionHandler {
/**
* 全局BO数据校验异常处理
* @param e
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public GraceJSONResult returnNotValidException(MethodArgumentNotValidException e) {
BindingResult result = e.getBindingResult();
Map<String, String> errors = getErrors(result);
return GraceJSONResult.errorMap(errors);
}
public Map<String, String> getErrors(BindingResult result) {
Map<String, String> map = new HashMap<>();
List<FieldError> errorList = result.getFieldErrors();
for (FieldError fe : errorList) {
// 错误所对应的属性字段名
String field = fe.getField();
// 错误信息
String message = fe.getDefaultMessage();
map.put(field, message);
}
return map;
}
}

1.5 测试效果

@Validated 前端表单数据校验插图

2. 其他

2.1 常用的校验注解

注解含义
@Null元素必须为null
@NotNull元素不能null
@AssertTrue元素必须为true
@AssertFalse元素必须是false
@Min(value)元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min)元素的大小必须在指定的范围内
@Digits(integer,fraction)元素必须是一个数字,其值必须在可接受的范围内
@Past元素必须是一个过去的日期
@Future元素必须是一个将来的日期
@Pattern(value)元素必须符合指定的正则表达式
@Email元素必须是电子邮箱地址
@Length字符串的大小必须在指定的范围内
@NotEmpty字符串必须非空
@Range元素必须在合理的范围内

2.2 @NoNull、@NotEmpty、@NotBlank

1.三者的区别

@NotNull
适用于基本数据类型(Integer,Long,Double等等),当 @NotNull 注解被使用在 String 类型的数据上,则表示该数据不能为 Null(但是可以为 Empty)
注:被其标注的字段可以使用 @size、@Max、@Min 对字段数值进行大小的控制

@NotEmpty:
不能为null,而且长度必须大于0,一般用在集合类上面,适用于 String、Collection集合、Map、数组等等,加了@NotEmpty 注解的参数不能为 Null 或者 长度为 0

@NotBlank:
不能为null,注意是只能用在String上,而且调用trim()后,长度必须大于0

2.3 @Valid 和 @Validated 比较

最后我们来对 @Valid 和 @Validated 两个注解进行总结下:

1:@Valid 和 @Validated 两者都可以对数据进行校验,待校验字段上打的规则注解(@NotNull, @NotEmpty等)都可以对 @Valid 和 @Validated 生效;
2:@Valid 进行校验的时候,需要用 BindingResult 来做一个校验结果接收。当校验不通过的时候,如果手动不 return ,则并不会阻止程序的执行;
3:@Validated 进行校验的时候,当校验不通过的时候,程序会抛出400异常,阻止方法中的代码执行,这时需要再写一个全局校验异常捕获处理类,然后返回校验提示。
4:总体来说,@Validated 使用起来要比 @Valid 方便一些,它可以帮我们节省一定的代码,并且使得方法看上去更加的简洁。

2.4 失效问题

单个对象无效

必须在controller中加上@Valid 或者@Validated,其中@Validated要和@NotEmpty组合使用

import org.springframework.validation.annotation.Validated;
@PostMapping("/schedule")
@ApiOperation("新增胎架计划")
public R saveSchedule(@Valid @RequestBody SubsectionPlanVo subsectionPlanVo) {
subsectionPlanService.saveSubsectionPlan(subsectionPlanVo);
return R.ok();
}

嵌套对象失效

需要在外层对象的属性上加@Valid

import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotBlank;
@Data
public class TestParam {
@NotBlank
private String className;
@Validated
private List<UserDTO> users;
}
import javax.validation.constraints.NotBlank;
@Data
public class UserDTO {
@NotBlank
private String name;
}

****************************************************

本站无任何商业行为
个人在线分享 » @Validated 前端表单数据校验
E-->