【Validation + i18n】✈️运行时参数校验+国际化上下文实现自定义参数校验规则

news2024/9/23 1:22:37

目录

👋前言

👀一、环境准备

📫二、代码实现

        2.1 Validation 自定义验证类

         2.2 自定义注解代码实现

💞️三、测试

 🌱四、章末


👋前言

        小伙伴们大家好,最近在和一位读者讨论国际化上下文工具使用的时候,遇到了另外一个问题

        问题场景如下,项目引入了 Validation 依赖,该依赖提供请求参数运行时校验,比如@NotBlank,@NotEmpty 等,并且这些注解可以指定校验不通过时的返回信息,但是将返回信息用国际化上下文表示时发现并不起作用,网上搜寻了下也是找到了原因,因为原生的 Bean Validation 注解不支持结合国际化上下文,但还是有方法实现的,因为 Validation 框架给用户提供了自定义验证器的接口,可以从该入口下手,详细如下:

👀一、环境准备

        注:本地项目基于 SpringBoot 框架,可以通过创建项目时使用 SPring intialor 快速创建或者普通的 java 项目然后手动添加启动类和配置文件.yml

        1.1 Validation 依赖引入

        该操作是通过 maven 工具将依赖引入本地,以便使用提供的校验注解;该操作之前有学习过,使用比较简单,文章链接如下

【Javax.Validation】✈️整合 SpringBoot 实现运行时的参数校验_javax.validation spring boot-CSDN博客

        1.2 国家化上下文 i18n 的搭建

        该过程比较简单,可以参考我之前的文章,链接如下:

MessageUtils 实现返回信息多语言支持-CSDN博客 

📫二、代码实现

        2.1 Validation 自定义验证类

        Validation 提供了 ConstraintValidator 接口供用户自定义实现,需要在泛型中声明搭配哪一个注解使用,以及该自定义验证器针对哪种数据格式使用

import com.example.demo.aop.CustomNotBlank;
import com.example.demo.common.component.MessageUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author HuangBen
 */
public class CustomNotBlankValidator implements ConstraintValidator<CustomNotBlank, String> {
    private String messageKey;


    @Override
    public void initialize(CustomNotBlank constraintAnnotation) {
        messageKey = constraintAnnotation.message();
    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if (s == null || s.trim().isEmpty()) {
            String msg = MessageUtils.get(messageKey);
            constraintValidatorContext.buildConstraintViolationWithTemplate(msg)
                    .addConstraintViolation()
                    .disableDefaultConstraintViolation();
            return false;
        }
        return true;
    }
}
         2.2 自定义注解代码实现

        这里定义注解的时候指定了该注解可以用作成员变量(FIELD)和 方法参数上面(PARAMTER),另外就是将该注解和自定义校验器通过 @Constraint 关联起来,还有一个注解标注运行时保留

        给该接口一个方法,用来在使用注解时没有指定消息 key (国际化上下文的 key)值的情况下使用默认的key

        groups 和 payload 方法是 Java Bean Validation 规范的一部分,用于支持复杂的验证场景。这里没有使用,但还是需要保留,因为要符合规范和确保注解正确工作

import com.example.demo.utils.CustomNotBlankValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author HuangBen
 */
@Constraint(validatedBy = CustomNotBlankValidator.class)
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomNotBlank {
    String message() default "{test.msg.info}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

💞️三、测试

        3.1 测试实体类

        3.2 简单创建一个测试请求路径

        注意这里搭配 Validation 框架使用时需要在被校验的参数前面加上 @Valid 注解否则不会判断

        3.3 APIPost 模拟请求测试

        使用接口测试工具来模拟请求检测注解是否生效 

        请求体 use.name 为 null 时 ,中文环境下结果如下

        请求体 use.name 为 null 时,英文环境下的结果

        请求体 use.name 为 正常格式 时,结果如下 

 🌱四、章末

        文章到这里就结束了~

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

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

相关文章

SpringBoot-01-全局异常处理器

在之前的项目中每一个异常的地方都要进行处理&#xff0c;十分的麻烦。 在springBoot项目中&#xff0c;提供了全局的异常处理器&#xff0c;可能出现异常的地方直接抛出即可。 RestControllerAdvice public class GlobalException {ExceptionHandlerpublic Result<String…

Golang | Leetcode Golang题解之第342题4的幂

题目&#xff1a; 题解&#xff1a; func isPowerOfFour(n int) bool {return n > 0 && n&(n-1) 0 && n%3 1 }

【电路笔记】-桥接 T 型衰减器

桥接 T 型衰减器 文章目录 桥接 T 型衰减器1、概述2、桥接 T 型衰减器示例 13、可变桥接 T 型衰减器4、完全可调衰减器5、可切换桥接 T 型衰减器Bridged-T 衰减器是另一种电阻衰减器设计,它是标准对称 T 垫衰减器的变体。 1、概述 顾名思义,桥接 T 形衰减器具有一个额外的电…

Chapter 39 Python多线程编程

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、并行执行二、threading模块 前言 现代操作系统如 macOS、UNIX、Linux 和 Windows 等&#xff0c;均支持多任务处理。本篇文章详细讲解了并行执行的概念以及如何在 …

苍穹外卖-day03(SpringBoot+SSM的企业级Java项目实战)

苍穹外卖-day03 课程内容 公共字段自动填充 新增菜品 菜品分页查询 删除菜品 修改菜品 功能实现&#xff1a;菜品管理 菜品管理效果图&#xff1a; 1. 公共字段自动填充 1.1 问题分析 在上一章节我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c…

本地ComfyUI安装全记录

资料 先看我写的stable diffusion全记录 ComfyUI 完全入门&#xff1a;安装部署 ComfyUI 完全入门&#xff1a;图生视频 ComfyUI【强烈推荐】 秋葉aaaki comfy UI整合包 可以使用stable diffusion的大模型&#xff0c;通过修改文件重新指向 修改路径即可 下载秋叶大佬的…

Linux 实操-权限管理:深入了解rwx的作用

&#x1f600;前言 本篇博文是关于Linux文件权限管理的基本知识和实际操作&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是…

git rebase 重建清爽的历史提交

前言 在代码评审时遇到分支上有多个commit信息&#xff0c;对于评审者来说是非常头疼的&#xff0c;因为太混乱了。遇到这样的情况&#xff0c;就需要让开发人员把commit压缩一下&#xff0c;简单来说就是将多个commit合并为一个&#xff0c;这样看起来就比较整洁了&#xff0…

【颠覆传统!】SmartEDA引领潮流:在线实时仿真,Multisim与Proteus望尘莫及的新纪元!

在电子设计自动化的浩瀚星空中&#xff0c;两款老牌软件——Multisim与Proteus&#xff0c;如同璀璨星辰&#xff0c;长久以来照亮了工程师们的设计之路。它们以强大的仿真功能和丰富的元件库&#xff0c;赢得了无数设计者的青睐。然而&#xff0c;时代的车轮滚滚向前&#xff…

关于FreeRTOS使用相关API函数导致程序阻塞的问题

前言&#xff1a; 如题。近日在给项目移植FreeRTOS的时候&#xff0c;发现调用如下API函数会阻塞&#xff1a; xTaskNotifyGive(xTaskGetHandle(Task_PrintCtrl_attributes.name)); 首先猜测可能是xTaskGetHandle有问题导致。通过printf打印调试信息&#xff0c;发现执行xTask…

乐凡三防平板定制:为行业量身打造的移动解决方案

在数字化转型的大潮中&#xff0c;移动设备成为企业提升效率、优化流程的关键工具。三防平板&#xff0c;以其坚固耐用、适应恶劣环境的特性&#xff0c;成为工业、物流、建筑、军事等领域不可或缺的选择。而三防平板的定制化服务&#xff0c;则进一步满足了不同行业对设备性能…

Linux | Linux进程万字全解:内核原理、进程状态转换、优先级调度策略与环境变量

目录 1、从计算机组成原理到冯诺依曼架构 计算机系统的组成 冯诺依曼体系 思考&#xff1a;为什么计算机不能直接设计为 输入设备-CPU运算-输出设备 的结构&#xff1f; 2、操作系统(Operator System) 概念 设计OS的目的 描述和组织被管理对象 3、进程 基本概念 进程id和父进程…

亲测好用,吐血整理 ChatGPT 3.5/4.0 新手使用手册~

废话不多说&#xff0c;直接分享正文~ 以下是小编为大家搜集到的最新的ChatGPT国内站&#xff0c;各有优缺点。 1、AI Plus&#xff08;稳定使用&#xff09; 推荐指数&#xff1a;⭐⭐⭐⭐⭐ yixiaai.com 该网站已经稳定运营了1年多了。2023年3月份第一批上线的网…

linux网络配置脚本

通过脚本&#xff0c;设置静态ip以及主机名 因为企业9的网络配置文件和企业7的不一样所以&#xff0c;我们以rhel9和rhel7为例 rhel7/centos7/openeuler #!/bin/bash cat > /etc/sysconfig/network-scripts/ifcfg-$1 << EOF DEVICE$1 ONBOOTyes BOOTPROTOnone IPAD…

数据埋点系列 14|跨平台和多源数据整合:构建全面数据视图的策略与实践

在当今复杂的数字生态系统中&#xff0c;组织的数据通常分散在多个平台和来源中。有效整合这些数据不仅可以提供全面的业务洞察&#xff0c;还能支持更准确的决策制定。本文将探讨如何实现跨平台和多源数据的有效整合。 目录 1. 数据整合的重要性2. 数据整合的挑战3. 数据整合…

695. 岛屿的最大面积(中等)

695. 岛屿的最大面积 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;695. 岛屿的最大面积 2.详细题解 该题是典型的深度优先搜索题&#xff0c;深度优先搜索的基本思想是&#xff1a;从某个节点出发&#xff0c;尽可能深地搜索图的分支…

Redis未授权访问漏洞利用合集

一、基本信息 靶机&#xff1a;IP:192.168.100.40 攻击机&#xff1a;IP:192.168.100.60 二、漏洞 & 过程 Redis 未授权访问漏洞利用无口令远程登录靶机 靶机 cd redis-4.0.8/src./redis-server ../redis.conf 攻击机 ./redis-cli -h 192.168.100.40 Redis 未授权访问…

删除微博博文js脚本实现

我当前的时间&#xff1a;2024.8.18 脚本可以直接使用&#xff0c;随着时间推移&#xff0c;微博页面元素可能会有变动。 思路&#xff1a;javascript 模拟手动点击&#xff0c;下滑&#xff0c;并且删除博文 首先登录微博&#xff0c;进入自己的博文界面如下&#xff1a; 进…

数据结构08--排序及查找

1.基本概念 排序是处理数据的一种最常见的操作&#xff0c;所谓排序就是将数据按某字段规律排列&#xff0c;所谓的字段就是数据节点的其中一个属性。比如一个班级的学生&#xff0c;其字段就有学号、姓名、班级、分数等等&#xff0c;我们既可以针对学号排序&#xff0c;也可以…

c++ opencv开发环境搭建

打开opencv官网&#xff0c;OpenCV - Open Computer Vision Library 然后点击之后&#xff0c;下载即可&#xff0c;下载完成之后&#xff0c;点击安装&#xff0c;等待安装完毕。 这是安装完毕之后的目录&#xff0c;已经包含了头文件与lib库、dll等&#xff0c;开发之前的环境…