当前位置: 首页 > news >正文

JSR303校验

校验的需求

前端请求后端接口传输参数,需要校验参数。

  1. 在controller中需要校验参数的合法性,包括:必填项校验、数据格式校验等
  2. 在service中需要校验业务规则,比如:课程已经审核过了,所以提交失败。

service中的业务规则不方便写成通用的代码,但是controller中的可以。

JSR-303定义了参数校验的规范,对bean属性进行校验。spring boot提供了JSR-303支持,即spring-boot-starter-validation

导入相关依赖

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

javax.validation.constraints包下有很多这样的校验注解,直接使用注解定义校验规则即可
在这里插入图片描述
在这里插入图片描述

实现

定义校验规则

@Data
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;......

开启校验

在controller方法中添加@Validated注解,开启校验

    @PostMapping("/course")public CourseBaseInfoDto createCourseBase(@RequestBody @Validated AddCourseDto addCourseDto) {Long companyId = 114514L;return courseBaseInfoService.createCourseBase(companyId, addCourseDto);}

如果校验出错Spring会抛出MethodArgumentNotValidException异常,我们需要在统一异常处理器中捕获异常,解析出异常信息。

    @ExceptionHandler(MethodArgumentNotValidException.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public RestErrorResponse exception(MethodArgumentNotValidException e) {BindingResult result = e.getBindingResult();List<String> msgList = new ArrayList<>();result.getFieldErrors().stream().forEach(item -> msgList.add(item.getDefaultMessage()));String msg = StringUtils.join(msgList, ",");log.error("【系统异常】{}", msg);return new RestErrorResponse(msg);}

测试

把必选项设置为空,发送请求。

略…

分组校验

有时在同一个属性上设置一个校验规则不能满足要求。

比如:订单编号在添加时要求为空,在修改时要求不为空。此时就需要用到分组校验,同一个属性定义多个校验规则属于不同的分组。

比如@NULL规则属于insert分组,@NotEmpty规则属于update分组。

实现

定义分组

用class类表示不同的分组,定义不同的接口类型表示不同的分组。

public class ValidationGroups {public interface Insert{};public interface Update{};public interface Delete{};
}

在定义校验规则时指定分组

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

在Controller方法中启动校验规则指定要使用的分组名

    @PostMapping("/course")public CourseBaseInfoDto createCourseBase(@RequestBody @Validated({ValidationGroups.Insert.class}) AddCourseDto addCourseDto) {Long companyId = 114514L;return courseBaseInfoService.createCourseBase(companyId, addCourseDto);}

校验规则不满足使用条件

  1. 手写校验代码
  2. 自定义校验规则注解(查阅相关资料)
http://www.lryc.cn/news/375087.html

相关文章:

  • 04 远程访问及控制
  • [晕事]今天做了件晕事38 shell里的source 点号
  • java如何分割字符串
  • 胡说八道(24.6.12)——数字电子技术以及Modelsim
  • 【Android面试八股文】AsyncTask中的任务是串行的还是并行的
  • 无人机RTMP推流EasyDSS直播平台推流成功,不显示直播按钮是什么原因?
  • 经验分享,xps格式转成pdf格式
  • 基于51单片机的音乐彩灯设计
  • API接口设计的艺术:如何提升用户体验和系统性能
  • 韩兴国/姜勇团队在《Trends in Plant Science》发表植物根系氮素再分配的观点文章!
  • 52.Python-web框架-Django - 多语言编译-fuzzy错误
  • Linux自旋锁
  • 服务器----阿里云服务器重启或关机,远程连接进不去,个人博客无法打开
  • go 定时任务
  • Java Character 类
  • MQTT协议应用场景
  • 3.4.马氏链-随机游走的常返性
  • HOT100与剑指Offer
  • 【AI开发】CRAG、Self-RAG、Adaptive-RAG
  • FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析
  • 七天进阶elasticsearch[Four]
  • 数据库-数据定义和操纵-DDL语言的使用
  • 黄金价格与美元的关系变了?
  • VB.net与C# 调用InitializeComponent的区别
  • 【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
  • 独立游戏之路:Tap篇 -- Unity 集成 TapTap 广告详细步骤
  • 设计灵感源泉!7个令人赞叹的网页界面设计展示
  • vivado PIN
  • docker部署mysql+nginx+redis
  • python文件操作、文件操作、读写文件、写模式