Spring后端参数校验——自定义校验方式(validation)

news2025/1/15 6:30:21

文章目录

    • 开发场景
    • 技术名词解释——Spring Validation
      • 自定义校验
    • 技术细节
    • 小结
      • 1.实体参数校验
      • 2.自定义校验
    • 完整代码

开发场景

业务场景:新增文章

基本信息

请求路径:/article

请求方式:POST

接口描述:该接口用于新增文章(发布文章)

请求参数

请求参数格式:application/json

请求参数说明:

参数名称说明类型是否必须备注
title文章标题string1~10个非空字符
content文章正文string
coverImg封面图像地址string必须是url地址
state发布状态string已发布 | 草稿
categoryId文章分类IDnumber

请求数据样例:

{
  "title": "陕西旅游攻略",
  "content": "兵马俑,华清池,法门寺,华山...爱去哪去哪...",
  "coverImg": "https://big-event-gwd.oss-cn-beijing.aliyuncs.com/9bf1cf5b-1420-4c1b-91ad-e0f4631cbed4.png",
  "state": "草稿",
  "categoryId": 2
}

参数校验请求参数中要求必要的信息
此时的参数

技术名词解释——Spring Validation

提示:这里可以添加技术名词解释

Spring 提供的一个参数校验框架,使用预定义的注解完成参数校验

1、引入Spring Validation 起步依赖
2、在参数前面添加@Pattern注解
3、在Controller类上添加@Validated注解

引入依赖
在这里插入图片描述

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

添加注解
在这里插入图片描述

自定义校验

已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解)

技术细节

1、自定义注解State
2、自定义校验数据的类StateValidation 实现ConstraintValidator接口
3、 在需要校验的地方使用自定义注解

① 自定义注解State
在这里插入图片描述
② 自定义校验数据的类StateValidation 实现ConstraintValidator接口
在这里插入图片描述
③ 在需要校验的地方使用自定义注解
在这里插入图片描述
④ 传参加@Validated

小结

提示:这里可以添加总结

1.实体参数校验

在这里插入图片描述

2.自定义校验

在这里插入图片描述

完整代码

1、注解State

import com.shisan.validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.*;

/**
 * @Author:shisan @Date:2024/5/8 21:07
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {StateValidation.class})
public @interface State {


  // 提供校验的条件,这里只校验是否为已发布或草稿
  String message() default "state参数只能是已发布或草稿";
  // 指定分组
  Class<?>[] groups() default {};
  // 负载
  Class<? extends Payload>[] payload() default {};
}

2、自定义校验数据的类StateValidation 实现ConstraintValidator接口

import com.shisan.anno.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

/**
 * @Author:shisan
 * @Date:2024/5/8 21:10
 */
public class StateValidation implements ConstraintValidator<State, String> {
    /**
     *
     * @param value 将来要检验的数据
     * @param constraintValidatorContext
     * @return 如果返回true,则校验通过,否则校验失败
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        // 提供校验
        if(value == null || value.length() == 0){
            return false;
        }
        if(value.equals("已发布") || value.equals("草稿") ){
            return true;
        }
        return false;
    }
}

3、实体类添加注解

import com.shisan.anno.State;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import org.hibernate.validator.constraints.URL;

import java.time.LocalDateTime;

/**
 * @Author:shisan @Date:2024/5/6 15:32
 */
@Data
public class Article {
  private Integer id; // 主键id
  // 1~10个非空字符串
  @NotEmpty(message = "标题不能为空")
  @Pattern(regexp = "^.{1,10}$", message = "标题格式不正确")
  private String title; // 文章标题

  @NotEmpty(message = "内容不能为空")
  private String content; // 文章内容
  // 必须是url地址
  @NotNull(message = "封面图片不能为空")
  @URL
  private String coverImg; // 封面图片

  @State private String state; // 发布状态 1 发布 0 草稿

  @NotNull(message = "分类不能为空")
  private Integer categoryId; // 文章id

  private Integer createUser; // 发布人id
  private LocalDateTime createTime; // 发布时间
  private LocalDateTime updateTime; // 修改时间
}

4、控制层添加@Validated

import com.shisan.pojo.Article;
import com.shisan.pojo.Result;
import com.shisan.service.ArticleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * @Author:shisan @Date:2024/5/8 10:51
 */
@RestController
@RequestMapping("/article")
@Slf4j
public class ArticleController {

  @Autowired private ArticleService articleService;
  /**
   * 请求路径:/article
   *
   * <p>请求方式:POST
   *
   * <p>接口描述:该接口用于新增文章(发布文章)
   */
  @PostMapping
  public Result addArticle(@RequestBody  @Validated Article article) {
    log.info("新增文章:{}", article);
    return articleService.addArticle(article);
  }
}

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

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

相关文章

STC8增强型单片机开发

1.C51版本Keil环境搭建 下载地址是 Keil Product Downloads 选择C51进行下载&#xff1a; 2.STC环境添加 STC-ISP下载 进入stc官网 深圳国芯人工智能有限公司-工具软件 3.将STC添加到Keil中 打开stc-isp工具 按照图例点击按钮 选择keil的安装目录&#xff0c;以实际安装目…

【SpringMVC 】什么是SpringMVC(三)?基于springmvc的文件上传、基于springmvc的拦截器、基于springmvc的邮件发送

文章目录 SpringMVC第五章1、SpringMVC文件上传1、基本步骤1-2345-82、邮件发送1、基本步骤1-234-5567-8 简单邮件带附件的邮件第六章1、拦截器的使用使用步骤232、调度的使用基本步骤1-56-8调度规则3、shiro安全框架核心概念基本语法1、基于ini文件的认证**测视类**2、基于rea…

电商API接口:品牌为提升价格竞争力做定价参考

品牌为了提升价格竞争力&#xff0c;在进行产品定价时&#xff0c;可以从以下几个方面作为参考依据&#xff1a; 市场调研&#xff1a; 分析同类竞品在各大电商平台的均价、最高价和最低价&#xff0c;了解市场行情和消费者心理预期价位。 成本核算&#xff1a; 精确计算产…

力扣41. 缺失的第一个正数

Problem: 41. 缺失的第一个正数 文章目录 题目描述思路复杂度Code 题目描述 思路 1.将nums看作为一个哈希表&#xff0c;每次我们将数字n移动到nums[n - 1]的位置(例如数字1应该存在nums[0]处…),则在实际的代码操作中应该判断nums[i]与nums[nums[i] - 1]是否相等&#xff0c;若…

【揭秘!】我国土地管理的基本国策与基本国情,你了解多少?

在这片古老而又充满活力的土地上&#xff0c;每一寸土地都承载着历史的记忆和未来的希望。我国的土地管理政策&#xff0c;正是在基本国情的基础上&#xff0c;精心编织的一张保障国家和人民利益的大网。今天&#xff0c;就让我们一起揭开我国土地管理的基本国策和基本国情的神…

论文分享[cvpr2018]Non-local Neural Networks非局部神经网络

论文 https://arxiv.org/abs/1711.07971 代码https://github.com/facebookresearch/video-nonlocal-net 非局部神经网络 motivation:受计算机视觉中经典的非局部均值方法[4]的启发&#xff0c;非局部操作将位置的响应计算为所有位置的特征的加权和。 非局部均值方法 NLM&#…

【管理咨询宝藏96】企业数字化转型的中台战略培训方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏96】企业数字化转型的中台战略培训方案 【格式】PDF版本 【关键词】SRM采购、制造型企业转型、数字化转型 【核心观点】 - 数字化转型是指&…

C++可变参数接口,批量写入和读取参数值的设计和实现

相关文章系列 手撕代码: C实现数据的序列化和反序列化-CSDN博客 目录 1.需求 2.问题分析 3.解决方案 3.1.类型抽象 3.2.参数配置 3.3.参数读取 1.需求 最近在做项目的时候&#xff0c;我们小组做的模块和另外一个小组做的模块的交付通过动态库接口的方式&#xff0c;他们…

模糊的图片文字,OCR能否正确识别?

拍照手抖、光线不足等复杂的环境下形成的图片都有可能会造成文字模糊&#xff0c;那这些图片文字对于OCR软件来说&#xff0c;是否能否准确识别呢&#xff1f; 这其中的奥秘&#xff0c;与文字的模糊程度紧密相连。想象一下&#xff0c;如果那些文字对于我们的双眼来说&#x…

【Android】源码解析Activity的结构分析

源码解析Activity的结构分析 目录 1、Activity、View、Window有什么关联&#xff1f;2、Activity的结构构建流程3 源码解析Activity的构成 3.1 Activity的Attach方法3.2 Activity的OnCreate 4、WindowManager与View的关系总结 1、一个Activity对应几个WindowManage&#xff0…

Linux cmake 初窥【3】

1.开发背景 基于上一篇的基础上&#xff0c;已经实现了多个源文件路径调用&#xff0c;但是没有库的实现 2.开发需求 基于 cmake 的动态库和静态库的调用 3.开发环境 ubuntu 20.04 cmake-3.23.1 4.实现步骤 4.1 准备源码文件 基于上个试验的基础上&#xff0c;增加了动态库…

pycharm中导入rospy(ModuleNotFoundError: No module named ‘rospy‘)

1. ubuntu安装对应版本ros ubuntu20.04可参考&#xff1a; https://wiki.ros.org/cn/noetic/Installation/Ubuntuhttps://zhuanlan.zhihu.com/p/515361781 2. 安装python3-roslib sudo apt-get install python3-roslib3.在conda环境中安装rospy pip install rospkg pip in…

4.26.7具有超级令牌采样功能的 Vision Transformer

Vision Transformer在捕获浅层的局部特征时可能会受到高冗余的影响。 在神经网络的早期阶段获得高效且有效的全局上下文建模&#xff1a; ①从超像素的设计中汲取灵感&#xff0c;减少了后续处理中图像基元的数量&#xff0c;并将超级令牌引入到Vision Transformer中。 超像素…

Python数据分析之绘制相关性热力图的完整教程

前言 文章将介绍如何使用Python中的Pandas和Seaborn库来读取数据、计算相关系数矩阵&#xff0c;并绘制出直观、易于理解的热力图。我们将逐步介绍代码的编写和执行过程&#xff0c;并提供详细的解释和示例&#xff0c;以便读者能够轻松地跟随和理解。 大家记得需要准备以下条…

谷歌十诫 Ten things we know to be true, Google‘s Core values

雷军曾经要求金山人人都必须能背谷歌十诫 我们所知的十件事 当谷歌刚成立几年时&#xff0c;我们首次写下了这“十件事”。我们时不时回顾这个列表&#xff0c;看看它是否仍然适用。我们希望它仍然适用——你也可以要求我们做到这点。 1. Focus on the user and all else wi…

视频号小店常见问题合集,准备做视频号小店的,赶紧收藏起来

大家好&#xff0c;我是电商花花。 现在视频号小店在电商行业中越来越受欢迎&#xff0c;视频号背后依靠者微信和腾讯强大的流量&#xff0c;拥有着超强的流量和市场&#xff0c;在今年的电商市场中有引起了一个热门话题&#xff0c;作为一个有流量有市场的新兴创业自然是吸引…

Springboot+vue项目人事管理系统

开发语言&#xff1a;Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架:springbootvue JDK版本&#xff1a;jdk1.8 文末获取源码 系统主要分为管理员和普通用户和员工三部分&#xff0c;主要功能包括个人中心&#xff0c;普通用户管理&…

【最经典的79个】软件测试面试题(内含答案)备战“金三银四”

001.软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 0002.问&…

UP互助 帮助UP起号做视频 支持B站和抖音

【软件名字】&#xff1a;UP互助 【软件版本】&#xff1a;1.0 【软件大小】&#xff1a;17.5MB 【软件平台】&#xff1a;安卓 【测试机型】&#xff1a;小米9 1.随便登个邮箱&#xff0c;添加自己平台的频道&#xff0c;然后就可以帮助别人&#xff0c;添加频道后在添加…

PostgreSQL数据库创建只读用户的权限安全隐患

PostgreSQL数据库模拟备库创建只读用户存在的权限安全隐患 default_transaction_read_only权限授权版本变更说明 看腻了就来听听视频演示吧&#xff1a;https://www.bilibili.com/video/BV1ZJ4m1578H/ default_transaction_read_only 创建只读用户&#xff0c;参照备库只读模…