当前位置: 首页 > ops >正文

如何优雅的使用进行参数校验

在spring里面有一个注解  @Validated

可以在方法的入参里面这样写

//方法
getActivityFlag(@RequestBody @Validated QueryActivityDto queryActivityDto) //参数详情@NotBlank(message = "userId不能为空")private String userId;@NotNull(message = "storeId不能为空")private String storeId;@NotBlank(message = "festivalId不能为空")private String festivalId;

然后进行报错拦截即可,拦截方式有多种

1、直接在切面进行拦截

实现如下方法

private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();/*** @param object object* @param groups groups*/
public static void validateObject(Object object, Class<?>... groups) throws ValidationException {Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);if (constraintViolations.stream().findFirst().isPresent()) {throw new ValidationException(constraintViolations.stream().findFirst().get().getMessage());}
}

2、进行自定义异常处理

ExceptionHandler(VvipException.class)
public ResultMsg handleException(VvipException e) {// 打印错误信息StackTraceElement s = e.getStackTrace()[0];log.error("msg:【{}】,file:【{}】,line:【{}】,method:【{}】", e.getMessage(), s.getFileName(), s.getLineNumber(), s.getMethodName());return ResultMsg.error(e.getErrorCode().getValue(), e.getMessage());
}private static String getParamErrorMsg(BindingResult bind) {String[] str = Objects.requireNonNull(bind.getAllErrors().get(0).getCodes())[1].split("\\.");String message = bind.getAllErrors().get(0).getDefaultMessage();String msg1 = "不能为空";String msg2 = "不能为null";String msg3 = "must not be null";String msg4 = "must not be empty";if (msg1.equals(message)|| msg2.equals(message)|| msg3.equals(message)|| msg4.equals(message)) {message = ArrayUtil.join(ArrayUtil.remove(str, 0), ".") + ":" + message;}return message;
}

3、还有一种就是在参数后面加一个 BindingResult对象(不推荐 耦合度太高)

findMemberByUnionid(@RequestBody @Validated QueryMemberByUnionidDto queryMemberDto, BindingResult result) {if(result.hasErrors()){result.getFieldErrors().forEach((item)->{log.error("参数错误:{}",item.getDefaultMessage());});}
http://www.xdnf.cn/news/17328.html

相关文章:

  • Day02 员工管理,分类管理
  • 202506 电子学会青少年等级考试机器人六级器人理论真题
  • 黑马SpringAI项目-聊天机器人
  • DeepSeek智能考试系统智能体
  • 大语言模型提示工程与应用:ChatGPT提示工程技术指南
  • 华为实验NAT
  • [Oracle] ADD_MONTHS()函数
  • 【Avalonia】无开发者账号使用iOS真机调试跨平台应用
  • 【SpringBoot】SpringWeb的开发
  • Cursor CLI 来了,准备 Build anything
  • ESP32-menuconfig(3) -- Serial flasher config
  • 四、redis入门之集群部署
  • 【LLM开发学习】
  • 应用层自定义协议
  • Redis基础数据类型
  • 广东省省考备考(第七十天8.8)——言语、判断推理(强化训练)
  • 01Vue3
  • [优选算法专题一双指针——三数之和]
  • Python训练营打卡Day26-函数专题2:装饰器
  • 最长回文子串
  • 远期(Forward)交易系统全球金融市场解决方案报告
  • Java 之 设计模式
  • Python名称映射技术:基于序列元素的高级访问模式详解
  • [科普] AI加速器架构全景图:从GPU到光计算的算力革命
  • 豆包新模型+PromptPilot:AI应用开发全流程实战指南
  • 【C++高阶五】mapset对红黑树的封装
  • Nestjs框架: 接口安全与响应脱敏实践 --- 从拦截器到自定义序列化装饰器
  • 【昇腾】Atlas 500 A2 智能小站制卡从M.2 SATA盘启动Ubuntu22.04系统,重新上电卡死没进系统问题处理_20250808
  • 大语言模型提示工程与应用:提示词基础使用方式
  • Redis原理,命令,协议以及异步方式