springboot如何传参校验@Valid及对其的异常捕获方式
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章将为大家详细讲解有关springboot如何传参校验@Valid及对其的异常捕获方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。传参校验@V
千家信息网最后更新 2025年11月07日springboot如何传参校验@Valid及对其的异常捕获方式
这篇文章将为大家详细讲解有关springboot如何传参校验@Valid及对其的异常捕获方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
传参校验@Valid及对其的异常捕获
springboot参数经常需要进行校验,比如创建文件,文件名就需要进行一定的校验。
本文以创建文件夹为例进行参数校验:controller:
首先就是在需要校验的参数类前面添加注释@Valid
@ApiOperation(value = "创建目录", notes = "在某目录下创建新文件夹") @ApiResponses({ @ApiResponse(code = 500, response = RestCodeMsg.class, message = "错误") }) @PostMapping(value = "api/scene/createdir") public ResponseEntity其次对参数类进行校验设置:
@Data@ApiModel@Getter@Setter@NoArgsConstructorpublic class ixviewVo { @ApiModelProperty("是否文件夹") private boolean dir; @NotBlank(message="目录名称不能为空") @Pattern(regexp="[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]*[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]$",message="目录名称不符合标准") @ApiModelProperty("目录名称") private String dirname; @ApiModelProperty("上级目录ID") private Long parentId;}其中[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]*[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]$为文件名称校验的正则表达式,复制进代码记得去掉自动生成的\。
到此,对参数校验的全部设置完成。当参数不符合校验则会抛出异常,接下来就是对抛出的异常进行捕获:
@RestControllerAdvicepublic class BadRequestExceptionHandler { private static final Logger logger = LoggerFactory.getLogger(BadRequestExceptionHandler.class); @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity validationBodyException(MethodArgumentNotValidException exception){ BindingResult result = exception.getBindingResult(); if (result.hasErrors()) { List 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 getPublicBackValue(boolean flag, String message) { Map map = new HashMap(); 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 paramQueryWrapper = new QueryWrapper<>(); paramQueryWrapper.eq("module_id", moduleId).eq("state", 1); TbModuleParam moduleParam = moduleParamService.getOne(paramQueryWrapper); List 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 ResponseDTOaddDict(@RequestBody @Validated LandInfoBasicVo saveVo) { boolean result = landInfoService.saveInfo(saveVo); return ResponseDTO.defaultResponse("保存成功"); }
@NotBlank(message = "土地名称不能为空") @Size(max = 1) private String landName;
@ControllerAdvicepublic class ExceptionHandle { private static final Logger logger = LoggerFactory.getLogger(ExceptionHandle.class); public static List 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 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 message = new ArrayList<>(); Set> constraintViolations = ex.getConstraintViolations(); if (!CollectionUtils.isEmpty(constraintViolations)) { constraintViolations.forEach(v -> message.add(v.getMessage())); } return ResponseDTO.customErrorResponse(-1, message.toString().replace("[","").replace("]","")); }} 关于springboot如何传参校验@Valid及对其的异常捕获方式就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
参数
目录
名称
文件
内容
文件夹
方式
信息
就是
文章
更多
标准
知识
篇文章
系统
结果
错误
不错
成功
接下来
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
策略为王 行情服务器
西软x6数据库
分布式列式数据库
传奇服务器ip
oa网络安全要求
服务器托管最低价格
数据库怎么按年月天存数据
汽车电子控制软件开发公司
数据库开发工程师项目实战
软件开发分层应用的特点
软件开发测试运维的特点
网络安全法第一讲讲的是什么
网络安全讲堂开讲
我的世界建造服务器2
小班网络安全教案及反思
数据库index可以做列名么
江西网络安全知识答题活动
软件开发应该具有哪些性格
安徽省星启天网络技术
天津数据库应用基地
上海悦奕网络技术有限公司
保证网络安全的核心战略
吸血鬼打服务器
东城区网络技术市场报价
超融合服务器硬件
软件开发源码部署
服务器配置与管理考试
西交网络安全与智能实验室
国际网络安全企业50强
怎么用cmd导数据库