在SpringBoot中使用 @Validated 2021-09-27

我再方法入参时添加了@Validated这个注解,如下

    @PostMapping(value = "/add")
    public Result<?> add(@RequestBody @Validated ProxyGroupUserIdMapping proxyGroupUserIdMapping) {
        proxyGroupUserIdMappingService.bindUserToGroupUser(proxyGroupUserIdMapping);
        return Result.OK("添加成功!");
    }

ProxyGroupUserIdMapping这个对象有两个字段添加了 非空的注解,并且给了指定的message

    @NotNull(message = "分组用户id不可为空")
    private String sysGroupUserId;
    /**系统普通用户的id*/
    @NotNull(message = "绑定用户id不可为空")
    private String sysUserId;

这里如果入参添加了@RequestBody在校验不通过时就会返回一个MethodArgumentNotValidException这样的异常,返回给前端时,就是一大串错误

org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.jeecg.common

显然这是不可取的,需要添加一个异常转换,如下

@RestControllerAdvice
@Slf4j
public class BaseExceptionHandler {
    //...省略部分异常逻辑
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<?> handleMedhodArgsValidata(Exception e) {
        log.error(e.getMessage(), e);
        //结果当入参为 @RequestBody  时返回的MethodArgumentNotValidException
        BindingResult bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        ObjectError objectError = allErrors.get(0);
        String defaultMessage = objectError.getDefaultMessage();
        return Result.error(400, defaultMessage);
    }

如此,就仅返回在校验不通过时的message了

参考资料
springboot中@Valid注解与@Validated注解区别以及全局异常的处理 - 萧暮 - 博客园 (cnblogs.com)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容