springboot + hibernate-validator 数据校验,统一异常处理并返回

第一步:引入依赖
spring-boot-started-web中包含了hibernate-validator,不需要额外引用

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

第二步:Post请求参数前增加@Valid注解,Get请求controller类上增加@Validated注解,参数上增加validator校验注解例如:@NotBlank
注意:@Valid在@RequestParam参数无效

    @PostMapping("/listDeviceByParams")
    public String listDeviceByParams(@RequestBody @Valid ListDeviceByParamsReqVO listDeviceByParamsReqVO) {
        return deviceFeign.cameraList(listDeviceByParamsReqVO);
    }

    @GetMapping("/gateway/getProbeResult")
    public String getProbeResult(@RequestParam("productKey") @NotBlank(message = "productKey不能为空") String productKey,
                                 @RequestParam("gatewayId") @NotBlank(message = "gatewayId不能为空") String gatewayId,
                                 @RequestParam("timeStamp") @NotBlank(message = "timeStamp不能为空") String timeStamp) {
        return deviceFeign.queryGatewayRealTimeSpeed(productKey, gatewayId, timeStamp);
    }

第三步:请求参数bean增加validator注解,增加默认提示消息message

@Data
public class ListDeviceByParamsReqVO {
    private Integer page = 0;

    private Integer size = 100;

    private String projectCard;

    @NotNull(message = "productKeys不能为空")
    private List<Productkey> productKeys;

    @NotNull(message = "gatewayType不能为空")
    private Integer gatewayType;

    private String gatewayId;

    private String searchKey;

    private String searchValue;

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

第四步:增加统一异常处理类@RestControllerAdvice,捕获参数校验异常MethodArgumentNotValidException并返回

@RestControllerAdvice
@Component
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler
    @ResponseBody
    public ApiCommonResVO<String> expHandler(Exception e){
        log.error("uncaught biz exception:",e);
        if (e instanceof MethodArgumentNotValidException){
            BindingResult result = ((MethodArgumentNotValidException) e).getBindingResult();
            if (result.hasErrors()){
                List<ObjectError> errors = result.getAllErrors();
                StringBuilder stringBuilder = new StringBuilder(ResCodeEnum.PARAM_VALID_ERROR.getResMessage());
                errors.forEach(error -> {
                    FieldError fieldError = (FieldError) error;
                    stringBuilder.append(",").append(fieldError.getDefaultMessage());
                    log.info("参数校验异常,{},{},{}",fieldError.getObjectName(),fieldError.getField(),fieldError.getDefaultMessage());
                });
                return ApiCommonResVO.fail(ResCodeEnum.PARAM_VALID_ERROR.getResCode(),stringBuilder.toString());
            }

        } else if (e instanceof ConstraintViolationException){

            Set<ConstraintViolation<?>> items = ((ConstraintViolationException) e).getConstraintViolations();
            StringBuilder stringBuilder = new StringBuilder(ResCodeEnum.PARAM_VALID_ERROR.getResMessage());
            items.forEach( item -> stringBuilder.append(item.getMessage()));
            return ApiCommonResVO.fail(ResCodeEnum.PARAM_VALID_ERROR.getResCode(),stringBuilder.toString());
        }
        return ApiCommonResVO.exception( e.getLocalizedMessage());
    }
}

第五步:启动并调用测试,测试成功


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