@Validated 前端表单数据校验

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 测试效果

在这里插入图片描述

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;
 
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/686964.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

充电桩,未来出行的绿色引擎

随着新能源时代的到来&#xff0c;充电桩早已不再是一个陌生的词汇&#xff0c;它正在成为我们生活中不可或缺的一部分。 它不仅仅是一个简单的充电设备&#xff0c;更是未来出行的绿色引擎&#xff0c;驱动着我们的汽车&#xff0c;也驱动着这个时代的绿色梦想。 想象一下&am…

重庆公司记账代理,打造专业财务管理解决方案的领先企业

重庆公司记账代理&#xff0c;作为专业的财务管理服务提供商&#xff0c;我们的目标是为公司的经营管理和决策提供科学、准确的财务数据支持&#xff0c;我们通过长期的专业经验和对市场的深入理解&#xff0c;为您提供一站式的记账服务和财务咨询。 专业团队 我们拥有一支由经…

企业物料主数据管理的重要性

物料主数据包含了对所有企业所采购、生产和存储在库存中物料的集中描述。它是企业中有关物料信息的物料数据代码库。将所有的物料数据集成在单一的物料数据库中&#xff0c;消除了数据冗余的问题&#xff0c;而且不仅允许采购部门使用这些数据&#xff0c;其他应用部门也可以使…

我们如何用npm发布自己的插件包?详细的教程来了

一、什么是npm插件&#xff1f; npm&#xff08;“Node 包管理器”&#xff09;是 JavaScript 运行时 Node.js 的默认程序包管理器。npm插件是指通过npm安装的第三方包&#xff0c;可以在Node.js项目中直接使用。这些插件涵盖了各种领域&#xff0c;包括Web开发、数据测试、构建…

什么是专业的倾斜摄影轻量化?

眸瑞科技是一家专业从事自研3D可视化技术底层、提供三维模型轻量化服务的高新技术公司&#xff0c;从事该行业近10年&#xff0c;有着丰富的三维模型处理及开发经验。目前已向许多企事业单位提供过工厂厂区、城市地貌、铁路桥梁、高速公路、旅游景区等倾斜摄影模型轻量化处理、…

什么是捷云等保一体机?解密等保一体机

捷云等保一体机的优点&#xff1f; 一台设备即可满足等级保护所有安全要求&#xff0c;避免了企业购买不同厂商的安全设备的问题。 可以降低等保整改成本&#xff0c;提高整改效率&#xff0c;可以帮助企业快速实现等保合规。 2 捷云等保一体机的安全能力&#xff1f; 捷云等保…

深入了解物流运输管理系统的重要性与实践

在当今竞争激烈的商业环境中&#xff0c;物流运输管理系统正变得越发重要。随着全球化贸易的迅速发展&#xff0c;企业需要更高效、更智能的方式来管理供应链运作&#xff0c;以确保产品能够准时以最优质的方式送达客户手中。物流运输管理系统作为一个关键的工具&#xff0c;为…

高德车道级安全预警再升级 10大场景全方位守护行车安全

今日起&#xff0c;2024年高考、端午节小长假相继到来&#xff0c;正值新一波出行高峰到来&#xff0c;高德地图车道级安全预警功能再次升级。升级后的车道级安全预警功能覆盖了10大安全风险较高的行车场景&#xff0c;全方位、超视距地为用户实时探测、预警行车风险&#xff0…

工厂生产计划难以执行的真正原因及对策

在制造业中&#xff0c;生产计划的执行对于企业的运营至关重要。然而&#xff0c;许多工厂在生产计划执行过程中面临着诸多挑战&#xff0c;尤其是物料齐套率低的问题。本文将探讨工厂生产计划难以执行的真正原因&#xff0c;并提出相应的解决对策。 一、生产计划难以执行的真…

005.FashionMNIST数据集简介

一、FashionMNIST数据集简介 FashionMNIST数据集&#xff0c;是一款作为经典的MNIST数据集的现代替代品的数据集&#xff0c;用来做衣物分类问题&#xff0c;由Zalando&#xff08;一家德国的在线时尚零售商&#xff09;发布。 该数据集含有10种类别&#xff0c;共70000个灰度图…

[Cesium学习]

Popup弹窗 Cesium点位弹窗_cesium popup弹窗-CSDN博客 Cesium构造popup弹窗函数_cesium popup-CSDN博客 开发之家 - Cesium构造popup弹窗函数 GitHub - cesium-plugin/cesium-popup-es6: 气泡弹窗 热力图分析 // 创建Cesium Viewer实例 const viewer new Cesium.Viewer(c…

java:reactor的Mono和Reactor的简单例子

【pom.xml】 <dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId><version>3.3.17.RELEASE</version> </dependency>【MyReactorTest2.java】 package com.chz.myReactor;import react…

擎创动态 | 擎创科技受邀参与电信数智“走进地市“专项行动启动会

为贯彻落实电信集团公司云改数转战略&#xff0c;切实推进数智公司"三化"战略落地&#xff0c;强化全国数智体系协同建设&#xff0c;5月24日由中电信数智科技有限公司&#xff08;以下简称“电信数智”&#xff09;、中国电信党校&#xff08;以下简称“人才发展中心…

SITNE24V2BNQ-3/TR一种瞬态电压抑制器,对标PESD1CAN

SITNE24V2BNQ是一种瞬态电压抑制器&#xff0c;设计用于保护两个汽车控制器区域 网络(CAN)母线不受ESD等瞬变造成的损坏。 SITNE24V2BNQ采用SOT-23封装。标准产品不含铅和卤素。 产品参数 方向&#xff1a;双向通道数&#xff1a;2VRWM(V)(Max)&#xff1a;24IPP8/20μS(A)(M…

风丘新加坡全资子公司正式成立!

在风丘科技&#xff08;WINDHILL&#xff09;成立20周年之际&#xff0c;风丘全资子公司——WINDHILL TECHNOLOGIES PTE. LTD.于2024年3月初正式在新加坡注册成立。 随着出海4.0时代的到来&#xff0c;为更快地响应海外区域客户的需求&#xff0c;风丘加大了区域市场的投入&…

stm32中如何实现EXTI线 0 ~ 15与对应IO口的配置呢?

STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位&#xff0c;每个中断/ 事件都有独立的触发和屏蔽设置。 STM32的19个外部中断对应着19路中断线&#xff0c;分别是EXTI_Line0-EXTI_Line18&#xff1a; 线0~15&#xff1a;对应外部 IO口的输入中断。 线16&…

Angular17版本集成Quill富文本编辑器

Angular17版本集成Quill富文本编辑器 前言:网上找了好多富文本资源,对应Angular17版本的且兼容的太少了,且找到不到对应的版本 自己就去网上找个兼容的免费的富文本组件 1.兼容Angular17版本的quill包 "types/quill": "^1.3.10","ngx-quill": …

攻防世界testre做法(考点:base58)

在做这道题目之前&#xff0c;我们先来简单了解一下base64加密和base58加密&#xff0c;先来说一些预备知识&#xff0c;bit为1个位&#xff0c;即一个0或1&#xff0c;八个位组成一个字节&#xff0c;即八个二进制数。 base64编码原理&#xff1a;1&#xff0c;在使用base64加…

plsql 实现自动补全语句

1.打开plsql程序所在文件目录 2.在此目录下新建文件auto_complete.txt &#xff08;文件名随便起&#xff09; 3.在auto_complete.txt 中写入关系对应&#xff1a; 4.在配置-首选项-用户界面-编辑器 中引入auto_complete.txt 即可 5.开一个sql窗口&#xff0c;输入sf 后敲个…

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版 VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U2 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访问原文链…