项目开发中会针对上游传过来的数据集中特定字段做一些校验
1.特定字段非空校验 @Validate @NotNull

@Immutable @Data public class MetaData{ @Valid @NotNull private CommonMetaData commonMeta; @Valid @NotNull @Indexed private Integer businessDate; private Integer version=1; private Map<String, String> generatedFrom; private Long sourceTimestamp; }

public <T> void schemaValidate(SpecificRecordBase specificRecordBase){ T t=getResult(specificRecordBase); if(null!=t) { Set<ConstraintViolation<T>> set = Validation.buildDefaultValidatorFactory().getValidator().validate(t); //针对t进行校验是否有空值 List<String> errorList = new ArrayList<>(); if (set != null && !set.isEmpty()) { for (ConstraintViolation<T> cv : set) { String property = cv.getPropertyPath().toString(); StringBuilder sb = new StringBuilder(); sb.append(cv.getMessage()); errorList.add(property + ":" + sb); } } if (!CollectionUtils.isEmpty(errorList)) { throw new ValidateException(400, errorList.toString()); } }else{ throw new ValidateException(400,"Input Is Null"); } } public <T> T getResult(SpecificRecordBase specificRecordBase) { return (T) gson.fromJson(specificRecordBase.toString(),BondQuoteData.class); }
2. 特定字段的特殊业务逻辑校验 @Constraint
2.1 Data:

@Data public class VlaueData { @Valid @NotNull @ValueConstraint private String id; }
2.2 controller:
controller层加上@Validate注解便可以实现对自定义注解字段的校验

@ApiOperation(value = "Save a list of BondQuote by putting service.") @PutMapping(value = "/v2/xip/markets/quotes", consumes = {MediaType.APPLICATION_JSON_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE}) @ResponseStatus(HttpStatus.OK) public void validate(@RequestBody @Valid VlaueData vlaueData){ constraintTest.valueProcess(); }
2.3 自定义注解类 ValueConstraint
这个类中定义校验类

@Documented @Constraint(validatedBy = ValueValidate.class) @Target({METHOD, FIELD, PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface ValueConstraint { String message() default "error input"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
2.4 校验类 ValueValidate
校验类实现 ConstraintValidator<ValueConstraint, String> 第一个参数对应2.3中自定义注解类,第二个参数对应2.1中要校验的参数类型

public class ValueValidate implements ConstraintValidator<ValueConstraint, String> {//第一个参数:@Interface自定义的注解类;第二个参数:要校验的数据类型 public static final String specificBusinessDatePattern = "^(\\d{8})$"; @Override public void initialize(ValueConstraint constraintAnnotation) { } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (!isIntValue(value)) { return false; } return true; } public boolean isIntValue(String string) { return string.matches(specificBusinessDatePattern); } }
当输入参数满足2.4中isValid()返回false时,校验不通过,返回异常response
输入参数满足2.4中isValid()返回true时,校验通过继续往下走
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?