Java项目实现报文数据校验注解方式(必输项、值大小)

普通项目

  • 导入校验依赖

        <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.1.0.Final</version></dependency><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency>
  • 编写校验工具(使用validator框架校验工具)

package com.csvn.utils;import com.csvn.blogs.dto.BlogFileDto;
import org.hibernate.validator.HibernateValidator;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;
import java.util.stream.Collectors;/*** @author haizhuangbu* @date 2024/5/14 12:56* @mark ValidatorUtils 校验工具*/
public class ValidatorUtils {private static Validator validator;private static final Object lockObj = new Object();/*** @param o* @return 返回异常信息*/public static String validator(Object o) {Validator validation = getValidation();Set<ConstraintViolation<Object>> validate = validation.validate(o);String errMessage = validate.stream().map(va -> va.getPropertyPath() + " : " + va.getMessage()).collect(Collectors.joining(","));return errMessage;}private static Validator getValidation() {if (validator == null) {synchronized (lockObj) {validator = Validation.byProvider(HibernateValidator.class).configure().buildValidatorFactory().getValidator();}}return validator;}}
  • 测试

  • 定义实体类

    package com.csvn.blogs.dto;import com.fasterxml.jackson.annotation.JsonFormat;
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    import org.hibernate.validator.constraints.NotBlank;import javax.validation.Valid;
    import java.util.Date;/*** @author haizhuangbu* @date 2024/4/24 21:29* @mark BlogFIleDto*/
    @Data
    @ApiModel("文件信息")
    @Valid
    public class BlogFileDto {@ApiModelProperty("文件id")@NotBlank(message = "文件id不能为空")private String fileId;@ApiModelProperty("文件名称")@NotBlank(message = "文件名称不能为空")private String fileName;@ApiModelProperty("文件路径")private String filePath;@ApiModelProperty("文件状态 Y 有效 N 失效")private String fileSts;@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")@ApiModelProperty("创建日期")private Date createTime;}
    
  • 调用工具校验

        BlogFileDto blogFileDto = new BlogFileDto();String validator1 = ValidatorUtils.validator(blogFileDto);System.out.println(validator1);
  • 测试效果


        

SpringBoot项目

  • 导入依赖

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.2.10.RELEASE</version>
    </dependency>
  • 接口使用(在接口实体类直接添加@Valid注解)

        @PostMapping("/saveContent")public Result<String> saveContentInfo(@Valid @RequestBody ContentInfo contentInfo) {blogsContentInfoService.insertContentInfo(contentInfo);return Result.of("内容插入成功");}
  • 通过异常拦截 @ControllerAdvice 获取校验异常

    package com.csvn.common;import org.springframework.context.support.DefaultMessageSourceResolvable;
    import org.springframework.validation.ObjectError;
    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.RestControllerAdvice;import java.util.stream.Collectors;/*** @author haizhuangbu* @date 2024/5/14 17:10* @mark RequestAdivce*/
    @RestControllerAdvice
    public class RequestAdvice {/*** @param methodArgumentNotValidException 方法参数校验异常* @return 异常信息*/@ExceptionHandler(value = MethodArgumentNotValidException.class)public Result methodError(MethodArgumentNotValidException methodArgumentNotValidException) {String errorMsg = methodArgumentNotValidException.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(","));return Result.error(errorMsg);}}
    

    拓展自定义实现参数校验(字典项校验) 

  • 自定义实现注解

    package com.csvn.utils.common;import javax.validation.Constraint;
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import javax.validation.Payload;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;@Constraint(validatedBy = {NotInMap.NotInMapImp.class}
    )
    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface NotInMap {String key(); // 字典码值String message() default "不存在字典项";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}
    

  • 自定义校验规则  

    class NotInMapImp implements ConstraintValidator<NotInMap, String> {String key;@Overridepublic void initialize(NotInMap annotation) {key = annotation.key();ConstraintValidator.super.initialize(annotation);}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {// 查询数据库 通过key// select * from s_cde where key = #{key}return false; // obj == null}}
  • 最终结果

详细校验项(最大值、最小值....注解)https://mp.csdn.net/mp_blog/creation/editor/135977372

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

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

相关文章

Docker安装Redis,并在 Visual Studio Code 中使用它

Docker安装Redis 查找Redis docker search Redis完整结果 PS C:\Users\cheng> docker search Redis NAME DESCRIPTION STARS OFFICIAL redis Redis is an open …

System V IPC(进程间通信)机制详解

文章目录 一、引言二、System V IPC的基本概念1、IPC结构的引入2、IPC标识符&#xff08;IPC ID&#xff09;3、S ystem V的优缺点 三、共享内存&#xff08;Shared Memory&#xff09;1、共享内存的基本概念2、共享内存的创建&#xff08;shmget&#xff09;3、共享内存的附加…

C++:并发保护

一、前言 本文将会通过保护一个数据讨论&#xff1a;互斥锁、双重检查锁、 std::once_flag 类、 std::call_once() 函数、单例模式、使用局部静态变量实现单例模式等。 二、保护共享数据 假设我们需要某个共享数据&#xff0c;而它创建起来开销不菲。因为创建它可能需要建立…

vim中的替换

:[range]s/pattern/replacement/flags 这里各部分的含义是&#xff1a; :[range]&#xff1a;可选的行范围&#xff0c;用于指定在哪些行之间进行替换。如果省略&#xff0c;则默认为当前行。例如&#xff0c;1,10 表示在第1行到第10行之间替换&#xff0c;% 表示在整个文件中…

python的文件操作及函数式编程介绍

五、文件操作 1、读取键盘输入 input 获取标准输入&#xff0c;数据类型统一为字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- str input("请输入&#xff1a;") print&#xff08;"你输入的内容是: ", str&#xff09; 这会产生如下的对应着输入的…

KeyShot 2023.3 Pro for mac/win:完美融合3D渲染与动画制作

在当今数字化时代&#xff0c;视觉内容的创作和表现越来越受到重视。无论是产品设计、建筑规划&#xff0c;还是影视特效&#xff0c;都需要具备出色的3D渲染和动画制作工具来展现创意和想法。而作为业内领先的3D渲染和动画制作软件之一&#xff0c;KeyShot 2023.3 Pro在这个领…

电脑刚开机的时候不卡,用一会就变卡顿了…怎么回事?

前言 昨天咱们聊到旧电脑更换了固态硬盘之后&#xff0c;开机就会变快的事情&#xff0c;这个确实是可行且有效的升级电脑办法之一。 看完这篇之后&#xff0c;切莫着急升级电脑硬件配置&#xff0c;因为这里的坑比你想象的还要多。 从机械硬盘测试的数据和固态硬盘的测试数…

类与面向对象编程(Object-Oriented Programming, OOP)

类与面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;&#xff08;一&#xff09; 对象比较&#xff1a;‘is’ 对比 ‘’ 当我还是个孩子的时候&#xff0c;我们的邻居拥有一对双胞胎猫咪。它们看起来几乎一模一样—同样的炭黑色毛发和同样锐利的绿色…

2024年港口危货安全管理证报名条件

危化品安全员证报考条件 1、职业道德良好&#xff0c;身体健康&#xff0c;年龄不超过60周岁(法定代表人除外). 2、建筑施工企业的在职人员。 3、学历及要求: (1)建筑施工企业主要负责人应为大专以上学历&#xff0c;需大专以上学历&#xff0c;除企业法人外&#xff0c;其他…

linux进阶高级配置,你需要知道的有哪些(11)-YUM仓库服务与PXE网络装机

1、基于RPM包构建的软件更新机制 可以自动解决依赖关系 所有软件包由集中的YUM软件仓库提供 2、软件仓库的提供方式 FTP服务&#xff1a;ftp://...... HTTP服务&#xff1a;http://...... 本地目录&#xff1a;file:///...... 3、客户端YUM命令 &#xff08;1&#xff0…

从CSDN搬家到微信公众号

博主将会在微信公众号里不断输出精品内容&#xff0c;陪伴大家共同成长。 如果你对博主的经历感兴趣&#xff0c;或者对博主的IT技术感兴趣&#xff0c;欢迎关注我的微信公众号&#xff0c;阅读我的技术文章&#xff0c;免费获取各种IT资源。也可以加我的微信成为我的好友&…

档案数字化加工是如何利用档案的

档案数字化加工是将纸质档案转化为数字形式&#xff0c;并进行后续的加工和利用。通过档案数字化加工&#xff0c;可以实现以下几个方面的利用&#xff1a; 1. 存储和保护&#xff1a;数字化档案可以将大量的纸质档案存储在数字存储介质中&#xff0c;从而节省空间和维护成本。…

TypeScript学习日志-第二十五天(编写发布订阅模式)

编写发布订阅模式 这是更具订阅模式写的代码 可以理解订阅模式的思想 interface I {events:Map<string,Function[]>once:(event:string,callback:Function)>void // 触发一次on:(event:string,callback:Function)>void // 订阅emit:(event:string,...args:any[])…

FileUpload控件

FileUpload控件是一个在Web应用程序中常用的界面元素&#xff0c;它允许用户从客户端选择文件&#xff0c;并将该文件上传到Web服务器。以下是关于FileUpload控件的一些详细信息&#xff1a; 基本功能&#xff1a;FileUpload控件通常显示为一个文本框和一个“浏览”按钮。用户…

面试算法之哈希专题

赎金信 class Solution { public:bool canConstruct(string ransomNote, string magazine) {// 小写字母int r_cnt[26];int m_cnt[26];for(int i 0; i< magazine.size(); i) {m_cnt[magazine[i]-a]; // 统计}// 对比for(int i 0; i< ransomNote.size(); i) {if(m_cnt[r…

使用vant-ui+vue3实现一个可复用的评星组件

如图所示 有两种情况 一种是5颗星 一种是3颗星 官网上只提供了图标类型的 并没有加文字 https://femessage-vant.netlify.app/#/zh-CN/ 自己结合两种情况 在全局注册了此组件(后续还会持续更新代码~) <template><div class"vant_rate_wrapper"><van…

【Javaer学习Python】 1、Django安装

安装 Python 和 PyCharm 的方法就略过了&#xff0c;附一个有效激活PyCharm的链接&#xff1a;https://www.quanxiaoha.com/pycharm-pojie/pycharm-pojie-20241.html 1、安装Django # 安装Django pip install Django# 查看当前版本 python -m django --version 5.0.62、创建项…

HTML常用标签-表格标签

表格标签 1 常规表格2 单元格跨行3 单元格跨行 1 常规表格 table标签 代表表格 thead标签 代表表头 可以省略不写 tbody标签 代表表体 可以省略不写 tfoot标签 代表表尾 可以省略不写 tr标签 代表一行 td标签 代表行内的一格 th标签 自带加粗和居中效果的td 代码 <h…

探索数据结构:堆的具体实现与应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 堆的概念 堆(Heap)是计算机科学中一类特殊的数据结构。堆通常是一个…

C++ QT设计模式 (第二版)

第3章 Qt简介 3.2 Qt核心模块 Qt是一个大库&#xff0c;由数个较小的库或者模块组成&#xff0c;最为常见的如下&#xff1a;core、gui、xml、sql、phonon、webkit&#xff0c;除了core和gui&#xff0c;这些模块都需要在qmake的工程文件中启用 QTextStream 流&#xff0c;Qdat…