hibernate validation,spring validation自定义参数校验
1.背景
在实际开发中,我们除了会使用常用的参数判断,如字符串不为空,最大值,最小值等
我们还可以自定义参数校验规则
2.实际生产问题
实际生产中同步订单的时候,
假设我们要求订单状态值只能是 -1, 0, 1, 或者不传
3.实现方案
步骤一:建立一个参数检查对象EnumValueValidator
注意:这里要用到下一步建立的注解EnumValue
package com.ldp.notify.common.validation; import cn.hutool.core.util.StrUtil; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; /** * @Copyright (C) * @Author: lidongping * @Date: 2020-12-24 17:57 * @Description: * <P> * 创建一个参数检查对象 * </P> */ public class EnumValueValidator implements ConstraintValidator<EnumValue, Object> { private String[] strValues; private int[] intValues; @Override public void initialize(EnumValue constraintAnnotation) { strValues = constraintAnnotation.strValues(); intValues = constraintAnnotation.intValues(); } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { if (value==null || StrUtil.isEmpty(value.toString())){ return true; } if (value instanceof String) { for (String s : strValues) { if (s.equals(value)) { return true; } } } else if (value instanceof Integer) { for (Integer s : intValues) { if (s == value) { return true; } } } return false; } }
步骤二:建立一个注解EnumValue
注意这里要用到上一步建立的检查对象EnumValueValidator
package com.ldp.notify.common.validation; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * @Copyright (C) * @Author: lidongping * @Date: 2020-12-24 17:53 * @Description: */ @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Documented @Constraint(validatedBy = {EnumValueValidator.class}) public @interface EnumValue { //默认错误消息 String message() default "必须为指定值:0,1"; String[] strValues() default {"0", "1"}; int[] intValues() default {}; //分组 Class<?>[] groups() default {}; //负载 Class<? extends Payload>[] payload() default {}; //指定多个时使用 @Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE}) @Retention(RUNTIME) @Documented @interface List { EnumValue[] value(); } }
第三步:使用
@Pattern(regexp = "^((-1)|(0)|(1)|())$", message = "status 取值范围为:-1,0,1,或不传")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人