经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
springboot 传参校验@Valid及对其的异常捕获方式
来源:jb51  时间:2021/10/19 19:16:29  对本文有异议

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

springboot参数经常需要进行校验,比如创建文件,文件名就需要进行一定的校验。

本文以创建文件夹为例进行参数校验:controller:

首先就是在需要校验的参数类前面添加注释@Valid

  1. @ApiOperation(value = "创建目录", notes = "在某目录下创建新文件夹")
  2. @ApiResponses({
  3. @ApiResponse(code = 500, response = RestCodeMsg.class, message = "错误")
  4. })
  5. @PostMapping(value = "api/scene/createdir")
  6. public ResponseEntity<Map> createNewOrEditFile(@RequestBody @Valid ixviewVo ixveVo) {
  7. ....
  8. //校验与内容无关
  9. }

其次对参数类进行校验设置:

  1. @Data
  2. @ApiModel
  3. @Getter
  4. @Setter
  5. @NoArgsConstructor
  6. public class ixviewVo {
  7. @ApiModelProperty("是否文件夹")
  8. private boolean dir;
  9. @NotBlank(message="目录名称不能为空")
  10. @Pattern(regexp="[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]*[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]$",message="目录名称不符合标准")
  11. @ApiModelProperty("目录名称")
  12. private String dirname;
  13. @ApiModelProperty("上级目录ID")
  14. private Long parentId;
  15. }

其中[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]*[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]$为文件名称校验的正则表达式,复制进代码记得去掉自动生成的\。

到此,对参数校验的全部设置完成。当参数不符合校验则会抛出异常,接下来就是对抛出的异常进行捕获:

  1. @RestControllerAdvice
  2. public class BadRequestExceptionHandler {
  3. private static final Logger logger = LoggerFactory.getLogger(BadRequestExceptionHandler.class);
  4. @ExceptionHandler(MethodArgumentNotValidException.class)
  5. public ResponseEntity validationBodyException(MethodArgumentNotValidException exception){
  6. BindingResult result = exception.getBindingResult();
  7. if (result.hasErrors()) {
  8. List<ObjectError> errors = result.getAllErrors();
  9. errors.forEach(p ->{
  10. FieldError fieldError = (FieldError) p;
  11. logger.error("Data check failure : object{"+fieldError.getObjectName()+"},field{"+fieldError.getField()+
  12. "},errorMessage{"+fieldError.getDefaultMessage()+"}");
  13. });
  14. }
  15. return ResponseEntity.ok(getPublicBackValue(false, "目录名称不符合标准"));
  16. }
  17. public Map<String, Object> getPublicBackValue(boolean flag, String message) {
  18. Map<String, Object> map = new HashMap<String, Object>();
  19. if (flag) {
  20. map.put("result_code", 0);
  21. } else {
  22. map.put("result_code", 1);
  23. }
  24. map.put("result_reason", message);
  25. return map;
  26. }
  27. }

@Valid校验异常捕捉

  1. @Api(tags = {"参数管理"})
  2. @Validated
  3. @RestController
  4. @RequestMapping("/module/param")
  5. public class TbModuleParamController {}
  1. public ResponseDTO getModuleParam(@PathVariable(name = "moduleId") @Valid @NotNull @Max(value = 13) @Min(value = 1) Integer moduleId) {
  2. QueryWrapper<TbModuleParam> paramQueryWrapper = new QueryWrapper<>();
  3. paramQueryWrapper.eq("module_id", moduleId).eq("state", 1);
  4. TbModuleParam moduleParam = moduleParamService.getOne(paramQueryWrapper);
  5. List<QueryParamVo> queryParamVoList = new ArrayList<>();
  6. if (moduleParam != null) {
  7. queryParamVoList = JSONArray.parseArray(moduleParam.getModuleJson(), QueryParamVo.class);
  8. }
  9. return ResponseDTO.defaultResponse(queryParamVoList);
  10. }
  1. @PostMapping(value = "/save", produces = WebServiceCommonConstant.PRODUCES_JSON)
  2. public ResponseDTO<Boolean> addDict(@RequestBody @Validated LandInfoBasicVo saveVo) {
  3. boolean result = landInfoService.saveInfo(saveVo);
  4. return ResponseDTO.defaultResponse("保存成功");
  5. }
  1. @NotBlank(message = "土地名称不能为空")
  2. @Size(max = 1)
  3. private String landName;
  1. @ControllerAdvice
  2. public class ExceptionHandle {
  3. private static final Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
  4. public static List<String> msgList = new ArrayList<>();
  5. /**
  6. * 异常处理
  7. *
  8. * @param e 异常信息
  9. * @return 返回类是我自定义的接口返回类,参数是返回码和返回结果,异常的返回结果为空字符串
  10. */
  11. @ExceptionHandler(value = Exception.class)
  12. @ResponseBody
  13. public ResponseDTO handle(Exception e) {
  14. //自定义异常返回对应编码
  15. if (e instanceof PermissionException) {
  16. PermissionException ex = (PermissionException) e;
  17. return ResponseDTO.customErrorResponse(ex.getCode(), ex.getMessage());
  18. }
  19. //其他异常报对应的信息
  20. else {
  21. logger.info("[系统异常]{}", e.getMessage(), e);
  22. msgList.clear();
  23. msgList.add(e.toString());
  24. StackTraceElement[] stackTrace = e.getStackTrace();
  25. for (StackTraceElement element : stackTrace) {
  26. msgList.add(element.getClassName() + ":" + element.getMethodName() + "," + element.getLineNumber());
  27. }
  28. return ResponseDTO.customErrorResponse(-1, "系统内部错误");
  29. }
  30. }
  31. @ExceptionHandler(value = MethodArgumentNotValidException.class)
  32. @ResponseBody
  33. public ResponseDTO handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
  34. List<String> message = new ArrayList<>();
  35. if (ex.getBindingResult() != null) {
  36. for (FieldError item : ex.getBindingResult().getFieldErrors()) {
  37. String itemMessage = item.getDefaultMessage();
  38. message.add(itemMessage);
  39. }
  40. }
  41. return ResponseDTO.customErrorResponse(-1, message.toString().replace("[","").replace("]",""));
  42. }
  43. @ExceptionHandler(value = ConstraintViolationException.class)
  44. @ResponseBody
  45. public ResponseDTO handleConstraintViolationException(ConstraintViolationException ex) {
  46. List<String> message = new ArrayList<>();
  47. Set<ConstraintViolation<?>> constraintViolations = ex.getConstraintViolations();
  48. if (!CollectionUtils.isEmpty(constraintViolations)) {
  49. constraintViolations.forEach(v -> message.add(v.getMessage()));
  50. }
  51. return ResponseDTO.customErrorResponse(-1, message.toString().replace("[","").replace("]",""));
  52. }
  53. }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号