springboot中使用ConstraintValidatorContext验证两个字段内容相同

 更新时间:2024年10月15日 09:44:22   作者:张占岭  
开发修改密码功能时,通过ConstraintValidator校验新密码和确认新密码的一致性,首先定义Matches注解和DTO对象,然后创建MatchesValidator类实现验证逻辑,对springboot验证字段内容相同问题感兴趣的朋友一起看看吧

场景

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

参考文档

实现

定义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 {
	@NotNull
	private String userName;
	@NotNull
	private String password;
	private String newPassword;
	@SameContentMatches(field = "newPassword")
	private String confirmPassword;
}

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

public class SameContentMatchesValidator implements ConstraintValidator<SameContentMatches, String> {
    private String field;
    @Override
    public void initialize(SameContentMatches constraintAnnotation) {
        this.field = constraintAnnotation.field();
    }
    @Override
    public 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;
	@Override
	public void initialize(SameContentMatches constraintAnnotation) {
		this.sourceField = constraintAnnotation.sourceField();
		this.destinationField = constraintAnnotation.destinationField();
	}
	@Override
	public 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 {
	@NotNull
	private String userName;
	@NotNull
	private String password;
	private String newPassword;
	private String confirmPassword;
}

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

到此这篇关于springboot中使用ConstraintValidatorContext验证两个字段内容相同的文章就介绍到这了,更多相关springboot验证字段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 整合数据源的具体实践

    SpringBoot 整合数据源的具体实践

    本文主要介绍了SpringBoot 整合数据源的具体实践,利用 Spring Boot 的自动配置和简化的注解来简化数据源配置工作,从而更专注于应用程序的业务逻辑开发,感兴趣的可以了解一下
    2023-11-11
  • Java 多线程优先级实例详解

    Java 多线程优先级实例详解

    这篇文章主要介绍了Java 多线程优先级实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java实现中英文词典功能

    Java实现中英文词典功能

    这篇文章主要为大家详细介绍了Java实现中英文词典功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • IDEA生成可运行jar包(包含第三方jar包)流程详解

    IDEA生成可运行jar包(包含第三方jar包)流程详解

    这篇文章主要介绍了IDEA生成可运行jar包(包含第三方jar包)流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 使用Spring boot 的profile功能实现多环境配置自动切换

    使用Spring boot 的profile功能实现多环境配置自动切换

    这篇文章主要介绍了使用Spring boot 的profile功能实现多环境配置自动切换的相关知识,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-11-11
  • SpringBoot应用优雅停机的3种标准方案

    SpringBoot应用优雅停机的3种标准方案

    所谓优雅停机(Graceful Shutdown),就是让应用在关闭前停止接收新请求;把正在处理的请求执行完;释放线程池、连接池、MQ 消费者等资源;最后再安全退出,今天讲清楚 SpringBoot优雅停机的3种标准方案,生产直接抄配置,需要的朋友可以参考下
    2026-03-03
  • Java关于IO流的全面介绍

    Java关于IO流的全面介绍

    下面小编就为大家带来一篇Java关于IO流的全面介绍。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • springBoot详解集成Swagger流程

    springBoot详解集成Swagger流程

    Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 Restful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法、参数和模型紧密集成到服务器端的代码,允许API来始终保持同步
    2022-06-06
  • Spring中的@Pointcut切点详解

    Spring中的@Pointcut切点详解

    这篇文章主要介绍了Spring中的@Pointcut切点详解,pointcut就是切点,通知需要在哪些方法处进行增强,在AspectJ中用@Pointcut注解表达式标注,需要的朋友可以参考下
    2023-08-08
  • Spingmvc中的HandlerMapping剖析

    Spingmvc中的HandlerMapping剖析

    这篇文章主要介绍了Spingmvc中的HandlerMapping剖析,Spingmvc中的HandlerMapping负责解析请求URL,对应到Handler进行处理,这里的Handler一般为Controller里的一个方法method,也可以为servlet或者Controller等,需要的朋友可以参考下
    2023-09-09

最新评论