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

news2025/1/17 2:47:32

普通项目

  • 导入校验依赖

        <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;
    
            @Override
            public void initialize(NotInMap annotation) {
                key = annotation.key();
                ConstraintValidator.super.initialize(annotation);
            }
    
            @Override
            public 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.coloradmin.cn/o/1674751.html

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

相关文章

lerna实战(一)

前言 将大型代码仓库分割成多个独立版本化的 软件包&#xff08;package&#xff09;对于代码共享来说非常有用。但是&#xff0c;如果某些更改 跨越了多个代码仓库的话将变得很 麻烦 并且难以跟踪&#xff0c;并且&#xff0c; 跨越多个代码仓库的测试将迅速变得非常复杂。 …

使用System.Drawing绘制基本几何图形

1.使用System.Drawing绘制一个正方形 using System; using System.Drawing; using System.Windows.Forms;public partial class MyForm : Form {public MyForm(){// 你可以在这里设置Form的双缓冲&#xff0c;以避免绘制时出现的闪烁 this.DoubleBuffered true;}protected o…

论文阅读:Self-Consistency Improves Chain of Thought Reasoning in Language Models

思维链 prompt 与预训练的大型语言模型相结合&#xff0c;在复杂的推理任务上取得了令人鼓舞的结果。在本文中&#xff0c;作者提出了一种新的解码策略&#xff0c;即自我一致性&#xff08;self-consistency&#xff09;&#xff0c;以取代思维链 prompt 中使用的 naive 贪婪解…

易货模式:引领交易新潮流,实现资源高效利用

随着全球经济的繁荣和科技的日新月异&#xff0c;传统的交易模式正面临革新。在追求高效、便捷与环保的当下&#xff0c;易货模式作为一种新兴的交易方式&#xff0c;逐渐崭露头角&#xff0c;受到越来越多人的青睐。 易货模式&#xff0c;简而言之&#xff0c;就是通过平台或在…

AI日报:OpenAI全能模型GPT-4o发布;阿里推自动化视频剪辑神器;AI作品会侵权吗?调研结果...;零一万物开源Yi-1.5模型

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;https://top.aibase.com/ 1、干翻所有语音助手&#x…

FreeRTOS中的动态内存管理(heap_1、heap_2、heap_3、heap_4)

FreeRTOS 提供了多种动态内存分配方案&#xff0c;这些方案通过不同的内存管理器&#xff08;heap managers&#xff09;实现&#xff0c;主要位于 FreeRTOS/Source/portable/MemMang 目录下。以下是几种常见的动态内存分配方案&#xff1a; heap_1 特点&#xff1a; 简单性…

np.linalg.norm()

np.linalg.norm()是NumPy中用于计算向量或矩阵的范数的函数。它可以计算不同类型的范数&#xff0c;包括向量的L1范数、L2范数以及矩阵的Frobenius范数等。 基本用法如下, numpy.linalg.norm(x, ordNone, axisNone, keepdimsFalse) x&#xff1a;输入数组&#xff0c;可以是…

【linux系统学习教程 Day02】网络安全之Linux系统学习教程,管道,文件内容统计,过滤排序,去重,目录介绍

1-4 管道 管道符号&#xff1a; | &#xff0c;可以将前面指令的执行结果&#xff0c;作为后面指令的操作内容。 ## 比如过滤ip地址 ip addr | tail -4 | head -1 解释一下就是先执行 ip addr ,得到的结果当做 tail -4 的输入&#xff0c;意思就是查看ip addr 结果的后四行内容…

高清模拟视频采集卡CVBS四合一信号采集设备解析

介绍一款新产品——LCC261高清视频采集与编解码一体化采集卡。这款高品质的产品拥有卓越的性能表现和丰富多样的功能特性&#xff0c;能够满足广大用户对于高清视频采集、处理以及传输的需求。 首先&#xff0c;让我们来了解一下LCC261的基本信息。它是一款基于灵卡技术研发的高…

linux学习:视频输入+V4L2

目录 V4L2 视频采集流程 代码例子 核心命令字和结构体 VIDIOC_ENUM_FMT VIDIOC_G_FMT / VIDIOC_S_FMT / VIDIOC_TRY_FM VIDIOC_REQBUFS VIDIOC_QUERYBUF VIDIOC_QBUF /VIDIOC_DQBUF VIDIOC_STREAMON / VIDIOC_STREAMOFF V4L2 是 Linux 处理视频的最新标准代码模块&…

苹果M4芯片:大模型本地运算的转折点

在人工智能和机器学习领域&#xff0c;大模型的兴起对硬件提出了前所未有的挑战。苹果公司最近推出的M4芯片&#xff0c;被视为其在这场竞赛中的“第一式”。本文将探讨M4芯片的特点&#xff0c;并与其他芯片进行比较。 M4芯片的亮点 Neural Engine算力&#xff1a;M4芯片的…

2024上半年软考准考证什么时候出?怎么打印?

2024上半年软考准考证打印时间&#xff1a; 北京&#xff1a;5月21日至5月24日 天津&#xff1a;5月21日9:00后 河北&#xff1a;5月20日起 山西&#xff1a;5月20日上午9:00至5月28日下午14:00 内蒙古&#xff1a;5月20日-5月25日 吉林&#xff1a;5月20日开始 辽宁&am…

批量剪辑与转码解析:一键实现MP4到FLV顺畅转换的技巧

在数字化多媒体日益盛行的今天&#xff0c;视频格式转换成为了我们日常生活和工作中不可或缺的一部分。尤其是当需要将MP4格式的视频转换为FLV格式时&#xff0c;批量剪辑与转码功能的出现&#xff0c;极大地提升了我们处理视频的效率。本文将为您详细解析云炫AI智剪如何一键实…

基于CLAHE算法的图像增强及评价

摘要&#xff1a; 本研究旨在探讨对比度限制自适应直方图均衡化&#xff08;CLAHE&#xff09;算法在数字图像处理中的应用。CLAHE算法通过在局部区域内进行直方图均衡化&#xff0c;有效地增强了图像的对比度&#xff0c;并在保持图像细节的同时避免了过度增强的问题。本文通过…

深入学习Linux内核之v4l2驱动框架(一)

一&#xff0c;概述 V4L2&#xff08;Video for Linux 2&#xff09;是Linux操作系统中用于支持摄像头和视频设备的框架。它提供了一组API和驱动程序接口&#xff0c;用于在Linux系统中进行视频采集、视频流处理和视频播放等操作。 V4L2的设计目标是支持多种设备&#xff0c;…

机器学习-KNN算法

机器学习-KNN算法 没有什么比顺其自然更有超凡的力量。没有什么比顺乎本性更具有迷人的魔力。 目录 机器学习-KNN算法 1.K近邻算法 2.KNN决策方式 1&#xff09;KNN分类预测规则 1&#xff09;KNN回归预测规则 3.KNN三要素 4.KNN算法实现方式 1&#xff09;蛮力实现 2&a…

C++ C# 贝塞尔曲线

二阶贝塞尔曲线公式 三阶贝塞尔曲线公式 C 三维坐标点 二阶到N阶源码 //二阶公式&#xff1a; FVector BezierUtils::CalculateBezierPoint(float t, FVector startPoint, FVector controlPoint, FVector endPoint) {float t1 (1 - t) * (1 - t);float t2 2 * t * (1 - t);…

【JS红宝书学习笔记】第1、2章 初识JS

第1章 什么是JavaScript JavaScript 是一门用来与网页交互的脚本语言&#xff0c;包含以下三个组成部分。 ECMAScript&#xff1a;由 ECMA-262 定义并提供核心功能。文档对象模型&#xff08;DOM&#xff09;&#xff1a;提供与网页内容交互的方法和接口。浏览器对象模型&…

Dubbo3.x 异步转同步源码

底层netty通信是异步的&#xff0c;那我们平时调用采取的同步是如何将底层的异步转为同步的呢&#xff1f; dubbo远程rpc协议和网络框架有多种&#xff0c;我们以默认的dubbo协议、网络框架netty作为切入点. 注意点&#xff1a;debug时将过期时间设置长一点&#xff1a; 调用…

【高阶数据结构】并查集 {并查集原理;并查集优化;并查集实现;并查集应用}

一、并查集原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类…