springboot 使用@Valid校验参数 异常消息处理

依赖

  • 注解
<dependency>
    <groupId>jakarta.validation</groupId>
    <artifactId>jakarta.validation-api</artifactId>
</dependency>
  • 校验支持,包含以上依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

定义校验条件和消息

public class MyDTO {
	@NotBlank(message = "ID不能为空")
	private String id;
}

指定需要校验的参数

@RestController
public class MyController {
	@PostMapping("/api/execute")
    public void execute(
            @Valid @RequestBody MyDTO mydto
    ) {}
}

效果

{"timestamp":"2021-12-08T08:21:34.000000786","status":400,"error":"Bad Request","exception":"org.springframework.web.bind.MethodArgumentNotValidException","message":"Validation failed for object='MyDTO'. Error count: 1","path":"/api/execute"}

异常消息处理

import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

@ControllerAdvice
@RestController
public class MethodArgumentNotValidExceptionHandler {
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Error onException(MethodArgumentNotValidException e) {
        List<FieldError> fieldErrors = e.getFieldErrors();
        List<String> messages = fieldErrors.stream().map(FieldError::getDefaultMessage).collect(Collectors.toList());
        String message = StringUtils.join(messages, ";");
        List<ErrorDetails> errors = fieldErrors.stream().map(
                fieldError -> new ErrorDetails(
                        fieldError.getObjectName(),
                        fieldError.getField(),
                        fieldError.getCode(),
                        fieldError.getDefaultMessage()
                )
        ).collect(Collectors.toList());
        return new Error(message, errors);
    }

    @Data
    static class Error {
        private final String exception = MethodArgumentNotValidException.class.getSimpleName();
        private final String message;
        private final List<ErrorDetails> errors;
    }

    @Data
    static class ErrorDetails {
        private final String objectName;
        private final String field;
        private final String code;
        private final String message;
    }
}

注: 如果不以@RestController注解,消息将以404状态响应返回

效果2

{"exception":"MethodArgumentNotValidException","message":"ID不能为空","errors":[{"objectName":"mydto","field":"id","code":"NotBlank","message":"ID不能为空"}]}

posted on   路过君  阅读(360)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2020-04-11 spring 启动时自动运行
2020-04-11 spring cloud oauth2授权服务 默认tokenService配置源码
2020-04-11 spring cloud 搭建oauth2授权服务 使用redis存储令牌
2020-04-11 spring cloud oauth2授权服务 clientDetails配置源码
2020-04-11 spring 验证框架
2020-04-11 IDEA 插件整理
2020-04-11 spring security笔记 默认登陆页面源码

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示