Springboot集成BeanValidation扩展一:错误提示信息加公共模板

Spring Boot 应用程序中的验证 Spring Boot 应用程序中的验证可以通过多种不同的方式完成。根据您的要求,某些方法可能比其他方法更适合您的应用程序。在这篇文章中,我们将探讨在 Spring Boot 应用程序中验证数据的常用选项。 验证是通过使用Bean Validation API完成的。Bean Validation API 的参考实现是Hibernate Validator。 所有必需的依赖项都打包在 Spring Boot 启动器 POM spring-boot-starter-validation 中。所以通常你需要 阅读详情

Bean Validator扩展
1、需求
​ 在使用validator时,有个需求就是公用错误提示信息,什么意思?

举个例子:

​ @NotEmpty非空判断,在资源文件中我不想每个非空判断都写”不能为空“,只需要写”###“,然后提示信息自动会变成”###不能为空“

代码:

复制代码
public class User{
//资源文件中user.name.empty=用户名
@NotEmpty(key={user.name.empty})
private String name;
‘’’
}
复制代码

//加入name为空,则最终的错误提示为“用户名不能为空”(会自动加上“不能为空”信息)
2、实现方式
有两种实现方式

方式一:手动调用验证方法
注解
复制代码
@Target({FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@ReportAsSingleViolation
@Constraint(validatedBy = {})
@NotNull
@Size(min = 1)
public @interface NotEmpty {

String message() default "{key}{com.chyjr.hyb.validator.constraints.empty.message}";

​
Class<?>[] groups() default { };
​
Class<? extends Payload>[] payload() default { };

String key() default "";

}
复制代码
验证器
//验证器
复制代码
public class MyValidator {

private static final Logger log = LoggerFactory.getLogger(HybValidator.class);

private static Validator validator = null;
private static MessageInterpolator msgInterpolator = null;

static {
    if (validator == null) {
        LocalValidatorFactoryBean factory = 
            (LocalValidatorFactoryBean) ApplicationContextUtil.getBean("validator");
        validator = factory.getValidator();
        msgInterpolator = factory.getMessageInterpolator();
    }
}

​
public static HybValidatorResult validate(Object object, Class<?>… groups) {
HybValidatorResult result = new HybValidatorResult();
Set<ConstraintViolation> violations = validator.validate(object, groups);
Map<String, String> map = new HashMap<>();
if (CollectionUtils.isEmpty(violations)) {
result.setErrors(false);
} else {
result.setErrors(true);
for (ConstraintViolation violation : violations) {
String path = violation.getPropertyPath().toString();
String message = violation.getMessage();
if (StringUtils.isBlank(path) || StringUtils.isBlank(message) || map.containsKey(path))
continue;
message = resolveMessage(message);
map.put(path, message);
}
result.setItems(map);
}
return result;
}

private static final Pattern elpattern = Pattern.compile("\\{[^{}]+\\}");

private static String resolveMessage(String message) {
    Matcher matcher = elpattern.matcher(message);
    try {
        while (matcher.find()) {
            String el = matcher.group();
            //用资源文件信息替换message = {key}{my.empty.message}
            //注解这里的key会替换成注解NotEmpty定义的key,即
            //message = {user.name.empty}{my.empty.message}
        String val = msgInterpolator.interpolate(el, null);
        if (StringUtils.isBlank(val))
            continue;
        message = message.replace(el, val);
        }
    } catch (Exception e) {
        log.error("验证引擎进行数据校验时出现异常, message:{}", message, e);
    }
    return message;
}

}
复制代码
使用
//调用验证方法获得验证结果
复制代码
HybValidatorResult bvr = HybValidator.validate(emp, CreateValidator.class);
//表示有错误
if (bvr.isErrors()) {
}
//资源文件内容
//my.empty.message=不能为空
//user.name.empty=用户名
复制代码
方式二:用spring自带的@Validated,无需调用验证方法
这里有个问题:@Validated注解不认注解@NotEmpty中的key,如何解决呢?

最终的实现方案:自定义验证器

代码:

注解
复制代码
@Documented
@Target({FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@ReportAsSingleViolation
//指定验证器
@Constraint(validatedBy = NotEmptyValidator.class)
public @interface NotEmpty {

String message() default "{my.empty.message}";

​
Class<?>[] groups() default { };
​
Class<? extends Payload>[] payload() default { };

String key() default "";

}
复制代码
验证器:自定义
复制代码
public class NotEmptyValidator extends AbstractValidator<NotEmpty,Object>{
​
@Override
public void initialize(NotEmpty notEmpty) {
​
}
​
@Override
public boolean doIsValid(Object value, ConstraintValidatorContext cc) {

    return value != null;
}

}
​
/**

  • 这里采用模板的设计模式
  • @param constraintAnnotation
    /
    public abstract class AbstractValidator<A extends Annotation,T> implements ConstraintValidator<A,T>{
    ​
    /
    *
    • 初始化由具体类实现
    • @param constraintAnnotation
      /
      @Override
      public abstract void initialize(A constraintAnnotation);
      ​
      /
      *
    • 初始化具体由实现类实现
    • @param value
    • @param context
    • @return
      /
      @Override
      public boolean isValid(T value, ConstraintValidatorContext context){
      //获取验证结果,采用模板方法
      boolean result = doIsValid(value,context);
      //当验证错误时修改默认信息
      if(!result){
      //改变默认提示信息
      if(ConstraintValidatorContextImpl.class.isAssignableFrom(context.getClass())){
      ConstraintValidatorContextImpl constraintValidatorContext =
      (ConstraintValidatorContextImpl)context;
      //获取默认提示信息
      String defaultConstraintMessageTemplate =
      context.getDefaultConstraintMessageTemplate();
      Object key =
      constraintValidatorContext.getConstraintDescriptor().getAttributes().get(“key”);
      //禁用默认提示信息
      context.disableDefaultConstraintViolation();
      //设置提示语(在message前面加上key)
      context.buildConstraintViolationWithTemplate(key + defaultConstraintMessageTemplate).addConstraintViolation();
      }
      }
      ​
      return result;
      }
      /
      *
    • 真正验证方法
    • @param value
    • @param context
    • @return
      */
      public abstract boolean doIsValid(T value, ConstraintValidatorContext context);
      }
      复制代码
      使用:
      调用的时候只要在JavaBean前加上@Validated注解即可

总结:上述就是在工作中遇到的问题,并扩展了Validator

landsat8数据下载教程 下载landsat数据教程 阅读详情

相关推荐

【全新官方接口】php检测微信域名拦截,检测微信域名被封

你的域名在微信被拦截的3种常见情况 1、域名因违规或有风险被拦截(红色拦截) 2、类似taobao.com,douyin.com这种的恶意竞争式拦截,淘宝、抖音等微信的竞争对手一般都是白色拦截(白色拦截) 3、有一个中间页的拦截,需要多次点击按钮才可以跳转到你的域名的,多是一些新型域名后缀,例如.top .xyz .link后缀,这种情况,备案后可以解决(备案拦截) 通过php get_headers()函数就可以分析到结果 这个下标为6是一个URL,在微信访问后正是这个讨厌的页面! 如果切换为

TANKING,开源开发者! 2876

Validator校验之ValidatorUtils

Validator校验之ValidatorUtils

qq_43040552的博客 4680

TortoiseGit之配置密钥

基于github的开发必须要用到rsa密钥,因此需要用到TortoiseGit的putty key generator工具,来生成既适用于github的rsa密钥也适用于TortoiseGit的ppk密钥。

欧文的博客 2081

后端数据校验之Validator的使用方法

后端数据校验之Validator的使用方法

m0_72167535的博客 5243

论文阅读4——一种宽频带圆极化微带天线的设计

论文阅读——一种宽频带圆极化微带天线的设计(现在才觉得开始弄懂了一点,懂了一点之后又更糊涂了……)

weixin_64612422的博客 2317

【已解决】WorkBuddy 国内版与国际版共存 + 关闭自动更新 教程

本文介绍在Windows系统中同时安装并共存WorkBuddy国内版与国际版的完整方案,通过修改product.json文件关闭启动自动更新,修复缓存配置污染问题,确保两版本互不干扰、数据独立。重点解决因共享身份标识导致的更新源错乱、进程锁冲突及自动覆盖风险,提供命令行备份与修改步骤,并强调手动升级时需避免使用应用内更新功能,以规避平台参数错位缺陷。

人生是一场修行 1526

Springboot中接口参数校验N种方法你会几个?

环境:springboot2.2.10.RELEASE Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),结合BindingResult对象可以直接获取错误信息。 JSR是什么? JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新

asoklove的专栏 1721

【数字IC/FPGA】低功耗设计

低功耗设计方法功耗的类型低功耗设计方法静态低功耗技术多阈值工艺方法电源门控方法体偏置动态低功耗技术多电压域(Multi-Voltage Domain)预计算门控时钟门级优化技术毛刺的消除逻辑级优化物理级优化控制输入向量低功耗Soc系统的动态管理动态电压及频率调节技术低功耗操作系统存储器功耗控制总结 功耗的类型 CMOS电路中的功耗由两部分构成,第一部分为负载电容充放电时引起的功耗,称为动态功耗,另一部分为漏电流引起的功耗,称为静态功耗。其中动态功耗包括翻转功耗和短路功耗。翻转功耗是数字电路中信号翻转时电容充

qq_40268672的博客 3072

Validator自定义校验

一.导入maven依赖 <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</versio...

a546835886的博客 1882

高空抛物监控系统:基于YOLOv8的轨迹追踪与可视化系统

本文详细介绍了一种基于YOLOv8深度学习模型的高空抛物监控系统,该系统能够实时检测并追踪高层建筑抛掷物的运动轨迹。文章包含完整的系统设计思路、算法实现细节、数据集构建方法以及基于PyQt5的可视化界面开发过程。我们提供了完整的Python实现代码,并讨论了系统的性能优化策略和实际部署考量。此外,我们还推荐了几个公开可用的高空抛物数据集,并详细分析了系统的应用前景和技术挑战。

YOLO 446

Codex 接入国产大模型完整指南:CC-Switch 与 Codex++ 的工程化选型

Codex 默认走 OpenAI Responses API,而 DeepSeek、GLM、Kimi 等国产模型只提供 OpenAI-compatible 的 Chat Completions——两套协议在消息结构、流式响应、reasoning 字段、tool call 上都不兼容,所以"改个 Base URL + 填国产 Key"这种朴素操作根本跑不通。本文从架构师视角出发,把 Codex 接入国产大模型这件事讲透:先剖析协议链路到底卡在哪,再对比 CC-Switch和 Codex++两套主流方案的差异

少说,多做 3858

Springboot集成BeanValidation扩展二:加载jar中的资源文件

一、需求 今天在搭建Springboot框架的时候,又遇到一个需求:在多模块系统中,有些模块想自己管理BeanValidation的资源文件(默认是启动项目claspath下的 ValidationMessages.properties)。刚开始还天真地认为springboot会不会帮我们做了,结果并没有,于是就是撸源码了。 以下是我的实现和实现原理 二、实现 @Configuration pub...

weixin_30835649的博客 370

【Dify】36氪新闻热榜智能自动化采集与AI处理

本文介绍如何利用Dify等自动化工具实现36氪新闻热榜的智能采集与处理。通过HTTP请求节点获取数据,JSON解析节点结构化处理,AI处理节点生成智能摘要,最终格式化输出结果。工作流程包含数据获取、解析、AI摘要、文本整理和内容输出五个环节,支持批量化、定制化的新闻处理需求。该方案适用于行业监测、内容创作、舆情管理等场景,显著提升信息获取效率,实现"所需即得"的自动化新闻服务。系统采用OpenAI GPT和Dify API作为核心模型,无需复杂人工干预即可完成全流程处理。

Mr数据杨 600

Spring5, 通过key不能获取validateMessages内容(validated, message,分组验证)

1.Config文件内容 @Bean public ReloadableResourceBundleMessageSource messageSource(){ ReloadableResourceBundleMessageSource msg = new ReloadableResourceBundleMessageSource(); msg.s...

java_user的专栏 1827

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

学习Spring中的validate 后台参数校验

前不久开发了代码生成器,通过Mybatis-plus的模板插件引擎动态生成crud模板。搞定后,就想对请求参数进行校验。由于我这个模板是通过表来生成的,也就是说在新增与编辑的时候,我也是会把相关的字段生成的,由于这表是从数据库读取的,那么这些字段的非空约束,字段长度约束...是可以进行参数校验,进行优化。 最近从网上查找了Spring的validate相关资料,学习一下哈。 val...

weixin_38423691的博客 1285

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

validation-api分组校验工具类

主要是根据业务场景需求对参数进行校验,不单单是Rest层的校验,也可以作为普通方法参数校验。 引入依赖 <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId...

meser88的博客 688

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring Boot ——使用javax.validation进行参数校验

demo1 实体类 public class UserBean { @NotBlank(message="用户名不能为空") private String userName; @NotBlank(message="年龄不能为空") @Pattern(regexp="^[0-9]{1,2}$",message="年龄不正确") private Stri.........

ityqing的博客 7931

java spring validation 自动、手动校验

参数校验是一个常见的问题,比如字段非空,字段长度限制,邮箱格式、手机格式验证等等。 避免校验规则,写一大串步骤,繁琐重复。 Hibernate Validator为此提供了一套比较完善、便捷的验证实现方式。

木辰風的博客 2989

validation自定义校验器

**检验手机号参数*//**校验邮件参数*/对于常量的校验,比如性别 1 男 2 女这类枚举值,如何通过检验器校验调用方的传参合法性,可定义一个枚举类的校验器进行校验。/*** 检验枚举*//// 指定校验器/**校验失败时的返回信息*//**分组校验*/Class<?/**负载*/Class<?/**枚举*/Class<?/**枚举编码*/@Override@OverrideClass<?try {/// 遍历枚举值,和传递的枚举值做对比。

fengchengwu2012的博客 500

Validator 的使用(springboot)

XSS 防攻Validator 的简单介绍常见的注解代码实现1.创建一个简单的实体类2.创建一个工具类供日后使用3.写一个接口验证一下 Validator 的简单介绍 记得前端时间接写前端页面对表单验证的时候的使用过 validator ,今天在项目中再次遇到。想总结一下以供日后使用!! 首先 spring-boot-starter-web包里面有hibernate-validator包,不需要引...

bnxf_xv的博客 847

Hibernate Validation各注解的用法Demo

依赖包 org.hibernate hibernate-validator 5.1.1.Final javax.el javax.el-api 2.2.4 org.glassfish.web javax.el 2.2.4 与spring整合的配置:    实体类属性上加注解约束 @NotNull(mes

吴先森的技术专场 1万+

SpringBoot中接口加密解密统一处理!

大家好,我是宝哥!1. 介绍在我们日常的Java开发中,免不了和其他系统的业务交互,或者微服务之间的接口调用如果我们想保证数据传输的安全,对接口出参加密,入参解密。但是不想写重复代码,我们可以提供一个通用starter,提供通用加密解密功能2. 前置知识2.1 hutool-crypto加密解密工具hutool-crypto提供了很多加密解密工具,包括对称加密,非对称加密,摘要加密等等,这不做详细...

程序员闪充宝 2863

java validate校验_自定义工具类实现validate参数校验

前言相信项目中做一些htttp接口,避免不了要对参数进行校验,大多数情况下,其实我们只是校验是否为NULL就可以了1、通过注解实现各种状态的字段1.1、引入依赖默认的版本是6.0.9.Final 使用过程中NotBlank会显示红色,所以这里讲版本降低,这样就不会显示红色了org.hibernatehibernate-validatorvalidation-apijavax.validation4...

weixin_39839162的博客 3431

Java校验validate

validation 技术在Java中运用最早在2009 年,Java 官方提出了 Bean Validation 规范,而后经历了JSR303、JSR349、JSR380 三次标准的更迭,发展到了 2.0。Bean Validation 和 我们以前学习过的 JPA 一样,只提供规范,不提供具体的实现。因此实际使用过程,常用的是 hibernate 的校验组件:org.hibernate.hibernate-validator。

皮球 3634

JSR303校验

JSR303校验

weixin_42732665的博客 359

java使用validator进行校验

https://blog.csdn.net/dream_broken/article/details/53584169 public class BeanValidator { // private static Validator validator = SpringContextHolder.getBean(Validator.class); /** * 验证某个bean的参数 * ...

weixin_39522272的博客 518
上一篇: Intellij IDEA最全的热键表(default keymap)
下一篇: 30道Redis面试题
jerrfw
博客等级 码龄15年 1粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值