springboot~ConstraintValidatorContext验证两个字段内容相同

news/2024/10/14 14:49:37

场景

我在开发修改密码功能,通过原密码和新密码及确认新密码,希望通过ConstraintValidator这个方式来校验新密码和确认新密码,规则是这两个密码需要是相同的。

参考文档

  • https://github.com/micronaut-projects/micronaut-core/issues/3243
  • https://stackoverflow.com/questions/37750656/how-to-access-a-field-which-is-described-in-annotation-property
  • https://discourse.hibernate.org/t/how-can-i-retrieve-current-validation-contexts-groups-in-a-validator/414/4

实现

定义Matches注解

@Constraint(validatedBy = SameContentMatchesValidator.class)
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface SameContentMatches {String message() default "内容不一致";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};String field(); // 新增属性,指定要比较的字段}

定义DTO对象

@Data
public class UserModifyPasswordDTO implements UserDTO {@NotNullprivate String userName;@NotNullprivate String password;private String newPassword;@SameContentMatches(field = "newPassword")private String confirmPassword;}

定义MatchesValidator对象,实现验证的代码逻辑

public class SameContentMatchesValidator implements ConstraintValidator<SameContentMatches, String> {private String field;@Overridepublic void initialize(SameContentMatches constraintAnnotation) {this.field = constraintAnnotation.field();}@Overridepublic boolean isValid(String object, final ConstraintValidatorContext context) {return true;}
}

遇到的问题

  • 在MatchesValidator类中,无法获取到当前对象,除非把SameContentMatches注解作用到当前类上面,而非字段上面。
  • 这个问题应该主是无法解决的,因为你拦截的是字段,在这个ConstraintValidatorContext处理的都是和当前字段有关的信息

应用到类上,代码调整,问题解决

@Constraint(validatedBy = SameContentMatchesValidator.class)
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface SameContentMatches {String message() default "内容不一致";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};/*** 源字段名* @return*/String sourceField();/*** 目标字段名* @return*/String destinationField();}public class SameContentMatchesValidator implements ConstraintValidator<SameContentMatches, Object> {private String sourceField;private String destinationField;@Overridepublic void initialize(SameContentMatches constraintAnnotation) {this.sourceField = constraintAnnotation.sourceField();this.destinationField = constraintAnnotation.destinationField();}@Overridepublic boolean isValid(Object o, final ConstraintValidatorContext context) {final Object sourceFieldVal = BeanUtil.getProperty(o, this.sourceField);final Object destinationFieldVal = BeanUtil.getProperty(o, this.destinationField);return sourceFieldVal.equals(destinationFieldVal);}}@Data
@SameContentMatches(sourceField = "confirmPassword", destinationField = "newPassword")
public class UserModifyPasswordDTO implements UserDTO {@NotNullprivate String userName;@NotNullprivate String password;private String newPassword;private String confirmPassword;}

上面的代码SameContentMatches注解出现了弱编码,这块需要再进行优化。

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

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

相关文章

制造业单项冠军 | 麦澜德如何用CRM管业务,做到“专精特新” ?

南京麦澜德医疗科技股份有限公司,股票代码:688273.SH(以下简称:麦澜德)成立于2013年,是国内女性全生命周期物理康复干预技术解决方案提供商。 公司产品广泛应用于妇产、盆底康复、生殖康复、泌尿肛肠、体检等医疗健康领域。荣获工信部专精特新小巨人企业、苏南潜在独角兽铜…

PyQt5 使用 aiohttp 发送异步请求

PyQt5 使用 aiohttp 发送异步请求 本文使用PyQt5演示,如何结合aiohttp库,发送异步请求 代码结构 本文中全部代码全在test_async_request.py这一个文件中编码,步骤中有变动的地方会注释标注,无改动的不会重复显示出来,需要看完整代码的,可直接移步到末尾。 需要安装PyQt5,…

华为 OD 的职级与薪资。。

大家好,我是R哥。 之前分享了一篇《冲进数字马力了!真滴香!!》,这是大厂内包,今天说说华为 OD,一种不同于普通外包的高级外包。 华为 OD,我们面试辅导也弄了不少人进去,很多小伙伴纳闷华为 OD 和华为正编、华为外包有什么区别? 一提到外包,可能大多数人都会嗤之以鼻…

HyperMesh基础教程:概述与有限元分析简介

1.1 HyperMesh 概述 本节将介绍有限单元法基本原理,HyperMesh 软件基本功能及界面介绍,获取在线帮助等内容。 1.1.1 有限元分析方法简介 有限单元法(FEM)是一种可以精确预测复杂结构在外界载荷作用下响应的方法,该数值方法起源于上世纪 50 年代。在有限单元法出现之前,验…

测试一下博客园的xss攻击防御,无恶意

★~!@#$%^&*()_+<>,./?;"[]{}- ★%3Cinput /%3E ★%3Cscript%3Ealert(XSS1)%3C/script%3E ★ ★ ★<input/ ★ ★ ★ ★javascript:alert(/xss5/) ★javascript:alert(/xss6/) ★ ★ ★<img src="#"/**/onerror=alert(/xss9/) width=100> ★…

使用 acme.sh 生成免费 90 天的 SSL 泛域名证书

原文地址求你点进去看,给自己的博客加加热度 https://typecho.hanzhe.site/archives/13.htmlacms.sh 是 Github 上开源的一款 SSL 证书申请工具,该工具安装配置完成后可帮我们申请免费 SSL 证书,并通过定时任务实现证书自动续期,理论上配置一次终生实用,官方有提供了中文文…

idea社区版配置springboot项目问题分析及处理

前言 记录一次使用IDEA社区版配置SpringBoot项目的经历,包括遇到的问题及解决过程 IDEA版本:IntelliJ IDEA 2024.2.3 (Community Edition) 问题描述1 IDEA社区版中并不支持Spring项目的创建等其他操作,在导入项目后无法自动识别,需要手动进行配置 解决过程1 项目导入后,在…