企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
新建 valid 文件夹, 在其下添加要分的组 这里是添加和更新俩个组 ``` public interface AddGroup { } ``` ``` public interface UpdateGroup { } ``` 实体类添加校验方式注解时 groups 里表示当前注解使用的组, 多个时, groups = {UpdateGroup.class, AddGroup.class} ``` /** * 品牌id */ @TableId @NotNull(message = "修改时id不能为空", groups = {UpdateGroup.class}) @Null(message = "新增时id必须为空", groups = {AddGroup.class}) private Long id; ``` 在controller 层的方法参数前增加 实体类Group 和 @Validated 有对应的组, 才会校验, 如果实体类Group没有任何组,则也不校验 ``` @Validated({AddGroup.class, UpdateGroup.class}) @RequestBody UserVo vo, ``` @Validated() 不使用分组校验时, 实体类加了分组的则不会校验, 只校验Group未分组的 获取校验结果 ``` public R register(@Valid @RequestBody UserVo vo, BindingResult result) { if(result.hasErrors()) { /*Map<String, String> collect = result.getFieldErrors().stream().collect(Collectors.toMap(fieldError -> { return fieldError.getField(); }, fieldError -> { return fieldError.getDefaultMessage(); }));*/ // 上面的简写 // stream().collect 这俩种写法注意实体类里面, 同一个字段校验不能同时有俩个, // 否则提示 Duplicate key XXX 错误 /* Map<String, String> errors = result.getFieldErrors() .stream() .collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage)); */ // 防止 Duplicate key XXX 错误 可以使用for, 添加到map注意key是否已存在 List<FieldError> errors = result.getFieldErrors(); for(FieldError fieldError:fieldErrors) { errors.put(fieldError.getField(), fieldError.getDefaultMessage()); System.out.println(fieldError); } // 把未通过校验的数据返回给前端 return R.error(errors); } } 上面这段可以只保留 @Validated({AddGroup.class}) 和 @Valid 去掉 BindingResult result 和 if() {} 在统一异常处理中解决 参考统一异常处理的文档 @ExceptionHandler(value = MethodArgumentNotValidException.class) public R handleValidException(MethodArgumentNotValidException e) { log.error("数据校验未通过:{},异常详细信息:{}", e.getMessage(), e); BindingResult bindingResult = e.getBindingResult(); Map<String, String> errors = Maps.newHashMap(); // 报错未通过的错误项, 返回给前端 bindingResult.getFieldErrors().forEach(fieldError -> { errors.put(fieldError.getField(), fieldError.getDefaultMessage()); }); // 把未通过校验的数据返回给前端 // 有错误码, 就加自己的错误码 return R.error(errors); } ```