springboot如何传参校验@Valid及对其的异常捕获方式

技术springboot如何传参校验@Valid及对其的异常捕获方式这篇文章将为大家详细讲解有关springboot如何传参校验@Valid及对其的异常捕获方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读

本文将详细解释回弹如何通过参数来验证@Valid,以及如何捕获它的异常。文章内容质量很高,我就分享给大家作为参考。希望大家看完这篇文章后对相关知识有一定的了解。

传参校验@Valid及对其的异常捕获

回弹参数经常需要验证。例如,创建文件时,需要验证文件名。

本文创建了一个文件夹作为参数验证的示例:

第一步是在要验证的参数类前面添加一个注释@Valid。

@ApiOperation(value='创建目录',notes='在目录下创建新文件夹')。

@ ApiResponsions({ 0

@ apiresponse(代码=500,响应=restcodemsg.class,消息=' error ')。

})

@PostMapping(值='api/scene/createdir ')

public responseentitymapcreateneworeditfile(@ request body @ valixiviewpoixvevo){ 0

.

//验证与内容无关。

}其次,检查并设置参数类:

@数据

@ ApiModel

@Getter

@Setter

@NoArgsConstructor

publicclassixviewVo {

@ApiModelProperty('文件夹与否')

privatebooleandir

@NotBlank(消息='目录名不能为空')。

@pattern(regexp='[^\\s\\\\/:\\*\\?\\\'\\|\\.]*[^\\s\\\\/:\\*\\?\\\'\\|\\.]$ ',消息='目录名不符合标准')。

@ApiModelProperty('目录名')

privateStringdirname

@ApiModelProperty('父目录标识')

privateLongparentId

}其中[\ \ s \ \ \/: \ \ * \ \?\\\'\\|\\.]*[^\\s\\\\/:\\*\\?\ \ \' \ \ | \ \.] $是用于文件名验证的正则表达式。请记住删除自动生成的\。

此时,参数验证的所有设置都已完成。当参数不符合验证时,将引发异常。下一步是捕获抛出的异常:

@RestControllerAdvice

public class BadRequestExceptionHandler {

privatesticfinallogger=logger factory . getlogger(BadRequestExceptionHandler . class);

@ exception handler(method argumentnotvalidexception . class)

public responseentityvalidationbodyexception(method argumentnot

ValidException exception){
        BindingResult result = exception.getBindingResult();
        if (result.hasErrors()) {
            List<ObjectError> errors = result.getAllErrors();
            errors.forEach(p ->{
                FieldError fieldError = (FieldError) p;
                logger.error("Data check failure : object{"+fieldError.getObjectName()+"},field{"+fieldError.getField()+
                        "},errorMessage{"+fieldError.getDefaultMessage()+"}");
            });
        }
        return ResponseEntity.ok(getPublicBackValue(false, "目录名称不符合标准"));
    }
    public Map<String, Object> getPublicBackValue(boolean flag, String message) {
        Map<String, Object> map = new HashMap<String, Object>();
        if (flag) {
            map.put("result_code", 0);
        } else {
            map.put("result_code", 1);
        }
        map.put("result_reason", message);
        return map;
    }
}

@Valid校验异常捕捉

@Api(tags = {"参数管理"})
@Validated
@RestController
@RequestMapping("/module/param")
public class TbModuleParamController {}
public ResponseDTO getModuleParam(@PathVariable(name = "moduleId") @Valid @NotNull @Max(value = 13) @Min(value = 1) Integer moduleId) {
        QueryWrapper<TbModuleParam> paramQueryWrapper = new QueryWrapper<>();
        paramQueryWrapper.eq("module_id", moduleId).eq("state", 1);
        TbModuleParam moduleParam = moduleParamService.getOne(paramQueryWrapper);
        List<QueryParamVo> queryParamVoList = new ArrayList<>();
        if (moduleParam != null) {
            queryParamVoList = JSONArray.parseArray(moduleParam.getModuleJson(), QueryParamVo.class);
        }
        return ResponseDTO.defaultResponse(queryParamVoList);
    }
@PostMapping(value = "/save", produces = WebServiceCommonConstant.PRODUCES_JSON)
    public ResponseDTO<Boolean> addDict(@RequestBody @Validated LandInfoBasicVo saveVo) {
        boolean result = landInfoService.saveInfo(saveVo);
        return ResponseDTO.defaultResponse("保存成功");
    }
@NotBlank(message = "土地名称不能为空")
    @Size(max = 1)
    private String landName;
@ControllerAdvice
public class ExceptionHandle { 
    private static final Logger logger = LoggerFactory.getLogger(ExceptionHandle.class); 
    public static List<String> msgList = new ArrayList<>();
 
    /**
     * 异常处理
     *
     * @param e 异常信息
     * @return 返回类是我自定义的接口返回类,参数是返回码和返回结果,异常的返回结果为空字符串
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseDTO handle(Exception e) {
        //自定义异常返回对应编码
        if (e instanceof PermissionException) {
            PermissionException ex = (PermissionException) e;
            return ResponseDTO.customErrorResponse(ex.getCode(), ex.getMessage());
        }
        //其他异常报对应的信息
        else {
            logger.info("[系统异常]{}", e.getMessage(), e);
            msgList.clear();
            msgList.add(e.toString());
            StackTraceElement[] stackTrace = e.getStackTrace();
            for (StackTraceElement element : stackTrace) {
                msgList.add(element.getClassName() + ":" + element.getMethodName() + "," + element.getLineNumber());
            }
            return ResponseDTO.customErrorResponse(-1, "系统内部错误");
        } 
    }
 
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public ResponseDTO handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        List<String> message = new ArrayList<>();
        if (ex.getBindingResult() != null) {
            for (FieldError item : ex.getBindingResult().getFieldErrors()) {
                String itemMessage = item.getDefaultMessage();
                message.add(itemMessage);
            }
        }
        return ResponseDTO.customErrorResponse(-1, message.toString().replace("[","").replace("]",""));
    } 
 
    @ExceptionHandler(value = ConstraintViolationException.class)
    @ResponseBody
    public ResponseDTO handleConstraintViolationException(ConstraintViolationException ex) {
        List<String> message = new ArrayList<>();
        Set<ConstraintViolation<?>> constraintViolations = ex.getConstraintViolations();
        if (!CollectionUtils.isEmpty(constraintViolations)) {
            constraintViolations.forEach(v -> message.add(v.getMessage()));
        }
        return ResponseDTO.customErrorResponse(-1, message.toString().replace("[","").replace("]",""));
    }
}

关于springboot如何传参校验@Valid及对其的异常捕获方式就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/37094.html

(0)

相关推荐

  • VB.NET Web Service怎么用

    技术VB.NET Web Service怎么用这篇文章将为大家详细讲解有关VB.NET Web Service怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.Web Servi

    攻略 2021年12月1日
  • opencv检测图像中的矩形(opencv 特征提取)

    技术opencv3.0识别并提取图形中的矩形的方法是什么这篇文章将为大家详细讲解有关opencv3.0识别并提取图形中的矩形的方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有

    攻略 2021年12月15日
  • Python中正则表达式的巧妙用法是怎么样的

    技术Python中正则表达式的巧妙用法是怎么样的Python中正则表达式的巧妙用法是怎么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 前言正则表达

    攻略 2021年10月26日
  • C#数据访问层的相关知识有哪些

    技术C#数据访问层的相关知识有哪些这篇文章给大家分享的是有关C#数据访问层的相关知识有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C#数据访问层1.查询数据库中的数据,返回一个datat

    攻略 2021年12月1日
  • 怎么使用JS

    技术怎么使用JS本篇内容主要讲解“怎么使用JS”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用JS”吧!1. Function 构造函数Function()构造函数虽然

    攻略 2021年10月30日
  • Sentinel动态数据源架构设计理念与改造实践是怎么样的

    技术Sentinel动态数据源架构设计理念与改造实践是怎么样的今天就跟大家聊聊有关Sentinel动态数据源架构设计理念与改造实践是怎么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根

    攻略 2021年10月21日