spring中的JSR-303统一校验

news2024/10/9 0:43:29

1.在前后端的传输参数的过程中数据在何处校验?

        在前后端都需要进行校验,只是分工不同.

2.各个层的校验内容:  

  1.Controller层主要负责校验残水的合法性,包括: 必填的参数字段,数据格式的校验

  2.Service层的业务校验是审核业务中的规则的相关内容,比如:课程已经审核通过所以提交失败这种错误,通常来书, 比较复杂,难以直接写成通用校验代码.

3.spring提供的支持:

        spring提供了是spring-boot-starter-validation来实现校验工作.依赖如下:

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

3.1定义校验规则       

代码中实现的方法(举例):

          1.@NotEmpty,@NotEmpty表示属性不能为空。

           2.@Size, 表示限制属性内容的长短

package com.xuecheng.content.model.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.math.BigDecimal;

/**
 * @description 添加课程dto
 * @author Mr.M
 * @date 2022/9/7 17:40
 * @version 1.0
 */
@Data
@ApiModel(value="AddCourseDto", description="新增课程基本信息")
public class AddCourseDto {

 @NotEmpty(message = "课程名称不能为空")
 @ApiModelProperty(value = "课程名称", required = true)
 private String name;

 @NotEmpty(message = "适用人群不能为空")
 @Size(message = "适用人群内容过少",min = 10)
 @ApiModelProperty(value = "适用人群", required = true)
 private String users;

 @ApiModelProperty(value = "课程标签")
 private String tags;

 @NotEmpty(message = "课程分类不能为空")
 @ApiModelProperty(value = "大分类", required = true)
 private String mt;

 @NotEmpty(message = "课程分类不能为空")
 @ApiModelProperty(value = "小分类", required = true)
 private String st;

 @NotEmpty(message = "课程等级不能为空")
 @ApiModelProperty(value = "课程等级", required = true)
 private String grade;

 @ApiModelProperty(value = "教学模式(普通,录播,直播等)", required = true)
 private String teachmode;

 @ApiModelProperty(value = "课程介绍")
 private String description;

 @ApiModelProperty(value = "课程图片", required = true)
 private String pic;

 @NotEmpty(message = "收费规则不能为空")
 @ApiModelProperty(value = "收费规则,对应数据字典", required = true)
 private String charge;

 @ApiModelProperty(value = "价格")
 private Float price;
 @ApiModelProperty(value = "原价")
 private Float originalPrice;


 @ApiModelProperty(value = "qq")
 private String qq;

 @ApiModelProperty(value = "微信")
 private String wechat;
 @ApiModelProperty(value = "电话")
 private String phone;

 @ApiModelProperty(value = "有效期")
 private Integer validDays;
}

     更多的校验规则如下所示:

3.2. 定义好之后需要在controller中添加开启的注解,

注解添加的位置是接受dto类的函数的入口参数出处,添加@Validated  举例如下:

@ApiOperation("新增课程基础信息")
@PostMapping("/course")
public CourseBaseInfoDto createCourseBase(@RequestBody @Validated AddCourseDto
addCourseDto){
    //机构id,由于认证系统没有上线暂时硬编码
    Long companyId = 1L;
    return courseBaseInfoService.createCourseBase(companyId,addCourseDto);
}

3.3在全局异常处理器中添加处理方法

        如果校验出错就会报错MethodArgumentNotValidException,所以需要在同一异常处理中添加如下的捕获信息,解析出异常信息

    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse doValidException(MethodArgumentNotValidException e){
        BindingResult result = e.getBindingResult();
        StringBuffer errMsg = new StringBuffer();
        List<FieldError> fieldErrors = result.getFieldErrors();
        fieldErrors.forEach(item->
        {
            errMsg.append(item.getDefaultMessage()).append(",");
        });
        log.error(errMsg.toString());
        return new RestErrorResponse(errMsg.toString());
    }

4.分组异常处理规则

有时候在同一个属性上设置的校验规则不能满足属性的要求,比如订单号的生成,在插入订单的时候要求订单编号为空,而在更新订单的时候要求订单的编号不为空,此时就用到了分组校验,同一个属性定义多个校验规则属于不同的分组,比如添加订单的@Null规则属于insert分组,更新订单名字的@NotEmpty属于update分组,而controller在调用validate的时候就去指定分组从而实现想要的效果.

package com.xuecheng.base.exception;

/**
 * @author YCL
 * @version 1.0
 * @description 定义校验粉组,因为对于同一属性,不同的情况要求的属性值不同
 * @date 2023-02-01 16:31
 */
public class ValidationGroups {
    public interface  Insert{};
    public interface  Update{};
    public interface  Delete{};
}

dto类中添加校验规则时指定分组:

 @NotEmpty(groups = {ValidationGroups.Insert.class},message = "添加课程名称不能为空")
 @NotEmpty(groups = {ValidationGroups.Update.class},message = "修改课程名称不能为空")
 @ApiModelProperty(value = "课程名称", required = true)
 private String name;

controller中的指定校验分组:

@ApiOperation("新增课程")
    @PostMapping("/course")
    public CourseBaseInfoDto createCourseBase(@RequestBody @Validated({ValidationGroups.Insert.class})  AddCourseDto addCourseDto){

        //获取当前用户所属培训机构的id
        Long companyId = 22L;

        //调用service
        CourseBaseInfoDto courseBase = courseBaseInfoService.createCourseBase(companyId, addCourseDto);
        return courseBase;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 为何比 vue2 快

vue3 为何比 vue2 快 测试环境&#xff1a;https://vue-next-template-explorer.netlify.app/ 1、proxy 响应式 vue3 优缺点&#xff1a; 深度监听性能更好可监听 新增 / 删除 属性可监听数组变化Proxy 能规避 Object.defineProxy 的问题Proxy 无法兼容所有浏览器&#xff…

OAuth2介绍

目录 一、什么是OAuth2 二、OAuth2中的角色 三、认证流程 四、令牌的特点 五、OAuth2授权方式 授权码 隐藏方式 密码方式 凭证方式 一、什么是OAuth2.0 概念&#xff1a;第三方授权解决方案 OAuth2.0是目前使用非常广泛的授权机制&#xff0c;用于授权第三方应用获取…

[NRF52] mesh DFU

mesh DFU升级过程&#xff1a;完整流程&#xff1a;以前nRF SDK DFU的实现是通过nRF51 Dongle配合主机nRF connect工具&#xff0c;且借助Secure DFU的后台式更新速率较快&#xff08;见另一篇笔记&#xff09;&#xff0c;现在的nRF mesh DFU分角色&#xff0c;全都由DK充当&a…

什么是单体应用?什么是微服务?

Monolith&#xff08;单体应用&#xff09;&#xff0c; 也称之为单体系统或者是 单体架构 。就是一种把系统中所有的功能、模块、组件等耦合在一个应用中应用最终打成一个(war,jar)包使用一个容器(Tomcat)进行部署&#xff0c;通常一个应用享用一个数据库。 也就是将所有的代码…

Java版数据结构与算法笔记

文章目录一、数据结构与算法概述及题目1、数据结构和算法的关系2、线性结构与非线性结构Ⅰ-线性结构Ⅱ-非线性结构3、经典面试题Ⅰ-字符串匹配问题&#xff1a;Ⅱ-汉诺塔游戏Ⅲ-八皇后问题:Ⅳ-马踏棋盘算法4、几个实际编程中遇到的问题Ⅰ-字符串替换问题Ⅱ-一个五子棋程序Ⅲ-约…

这家芯片企业,从创立之初就用 Authing 管理身份

在德州仪器和苹果的经验&#xff0c;让我深知统一身份管理要从 Day 1 做起。——Alpha Cen 联合创始人 & CEO 王璠 案例亮点&#xff1a; 打通 2000 主流应用、满足芯片初创企业统一身份需求 一周快速上线&#xff0c;产品开箱即用&#xff0c;后续无需费力运维 基于协同…

Pytorch安装及环境配置详细教程(CUDA版本)

文章目录前言一、查看GPU支持的CUDA版本二、安装CUDA三、确定torch、torchvision和python版本四、安装anaconda五、安装torch和torchvision前言 安装cuda版本的pytorch时踩了不少坑&#xff0c;网上安装pytorch的版本很多&#xff0c;一般的教程都是到pytorch的官网&#xff0…

相比传统专线网络,爱快、飞连等主流SD-WAN方案好在哪里?

当企业发展至一定的规模后&#xff0c;移动办公、异地办公会逐渐成为刚需&#xff0c;这就对企业的网络架构提出了新的挑战。 一般来说&#xff0c;企业在发展中所遇到的这些新增的网络需求&#xff0c;有两种比较常见的解决方案&#xff0c;其中之一是专线连接 。专线虽然简单…

【Unity3D插件】Build Report Tool插件,Build报告,优化包体,查看资源占用

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章介绍一下Build Report Tool插件的使用。 Build Repor…

在Visual Studio中调试Linux控制台程序

最近&#xff0c;Visual Studio 2022 17.5 预览版3 面向广大 Linux 开发者提供了一项新特性&#xff1a;在 Visual Studio 集成的终端中调试 C Linux 控制台程序。 如需了解更多关于集成终端的功能以及它在 Visual Studio 中的工作原理&#xff0c;请参考我们之前的一篇文章: I…

Linux系统安装Hadoop步骤详解

一、 安装新的虚拟机。 配置根据电脑内存自由处理&#xff0c;一般来说&#xff0c;虚拟机内存设为电脑内存一半 二、打开虚拟机&#xff0c;设置语言&#xff0c;时区&#xff0c;硬盘分区&#xff0c;密码&#xff0c;用户等 三、修改ip地址&#xff0c;连接xshell 3.1关闭…

Acer传奇Go电脑开机几分钟就会蓝屏怎么重装系统?

Acer传奇Go电脑开机几分钟就会蓝屏怎么重装系统&#xff1f;有用户使用的Acer传奇Go电脑出现了一些系统故障&#xff0c;电脑正常开机使用几分钟之后&#xff0c;马上就会出现蓝屏的情况&#xff0c;导致无法正常的使用。那么这个情况如何去重装系统呢&#xff1f;来看看以下的…

在产业互联网时代,以生态和边界为代表的有限市场的瓜分业已完成

在这样一个过程中&#xff0c;阿里们更多地思考的是&#xff0c;如何与产业结合&#xff0c;而非独立于产业之外&#xff0c;仅仅只是做一个旁观者和第三方。无论是它们投身到物流、制造、能源化工等行业之中&#xff0c;还是它们对这些产业的传统玩家们深度赋能&#xff0c;几…

第三章 TCG 规范解读【嵌入式工作组】【工业工作组】

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

Elasticsearch:彻底理解 Elasticsearch 数据操作

Elasticsearch 中有四种基本的数据操作。 每个操作都有自己的资源需求。每个用例都使用这些操作&#xff0c;但它们会优先于某些操作。 Index&#xff1a;在这里被用做动词&#xff0c;而不是其名词索引。处理文档并将其存储在索引中以供将来检索。Delete&#xff1a;从索引中…

【攻防世界】easyphp

废话不多说&#xff0c;打开环境就是一大段的php代码&#xff0c;对于我一个小白来说&#xff0c;还是难阿&#xff01;只能一点点琢磨构造payload的思路&#xff0c;当然也是在网上参考了别人的wp。记录下来也为了加深自己的印象&#xff0c;有事没事都能翻一翻&#xff0c;温…

快速入门OAuth2

1. 什么是OAuth2.0OAuth2.0是目前使用非常广泛的授权机制&#xff0c;用于授权第三方应用获取用户的数据。举例说明&#xff1a;用户可以通过选择其他登录方式来使用gitee&#xff0c;这里就使用到了第三方认证。来自RFC 6749OAuth 引入了一个授权层&#xff0c;用来分离两种不…

2023年Verasity路线图深度分析

Verasity最近发布了迄今为止最详细和雄心勃勃的2023年路线图之一。它主要集中在VeraViews的商业目标&#xff0c;以及VeraCard的推出&#xff0c;它充满了产品更新和令人兴奋的新功能&#xff0c;既为我们的企业对企业&#xff08;B2B&#xff09;产品&#xff0c;也为你&#…

解决PowerShell或vscode无法启动yarn的问题

问题现象&#xff1a;在PowerShell中启动yarn时报错&#xff1a;yarn : 无法加载文件 C:\Users\{{username}}\AppData\Roaming\npm\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅https:/go.microsoft.com/fwlink/?LinkID135170 中的 about…

DL@starter@Perceptron感知机@简单神经网络

文章目录感知机简单感知机基础形式偏置值形式逻辑门感知机机器学习的任务(单层)感知机的局限线性和非线性多层感知机从与非门到计算机小结从感知机到神经网络激活函数&#x1f388;非线性激活函数step 函数阶跃函数的实现(numpy)sigmoid functionsigmoid函数sigmoid 函数和阶跃…