前言
日常開發中,接口的參數校驗必不可少,本文記錄使用validation優雅進行參數校驗。
官方介紹:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-validation
代碼編寫
引入依賴
<!--引入validation依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
創建兩種Vo
/** * 用戶Vo */ @Data public class UserVoByAdd { @Pattern(regexp = "\\d+$",message = "主鍵只能是數字") @NotEmpty(message = "主鍵不能為空") private String id;//表id @NotEmpty(message = "名字不能為空") private String name;//名字 @DecimalMin(value = "18",message = "年齡不能小於18歲") @DecimalMax(value = "25",message = "年齡不能大於25歲") @NotNull(message = "年齡不能為空") private Integer age;//年齡 @NotEmpty(message = "地址不能為空") private String addr;//地址 @Email(message = "郵件格式不正確") @NotEmpty(message = "郵件不能為空") private String email;//郵件 }
/** * 用戶Vo */ @Data public class UserVoByEdit { @NotEmpty(message = "主鍵不能為空") private String id;//表id private String name;//名字 @DecimalMin(value = "18",message = "年齡不能小於18歲") @DecimalMax(value = "25",message = "年齡不能大於25歲") private Integer age;//年齡 private String addr;//地址 @Email(message = "郵件格式不正確") private String email;//郵件 }
統一異常捕獲
/** * 統一異常處理 */ @RestControllerAdvice public class ExceptionHandlerConfig { /** * validation參數校驗異常 統一處理 */ @ExceptionHandler(value = BindException.class) @ResponseBody public Result exceptionHandler500(BindException e){ e.printStackTrace(); StringBuilder stringBuilder = new StringBuilder(); for (ObjectError error : e.getAllErrors()) { stringBuilder.append("["); stringBuilder.append(((FieldError) error).getField()); stringBuilder.append(" "); stringBuilder.append(error.getDefaultMessage()); stringBuilder.append("]"); } return Result.of(10002,false,"【參數校驗失敗】 " + stringBuilder.toString()); } @ExceptionHandler(value = ConstraintViolationException.class) @ResponseBody public Result exceptionHandler500(ConstraintViolationException e){ e.printStackTrace(); StringBuilder stringBuilder = new StringBuilder(); for (ConstraintViolation<?> error : e.getConstraintViolations()) { PathImpl pathImpl = (PathImpl) error.getPropertyPath(); String paramName = pathImpl.getLeafNode().getName(); stringBuilder.append("["); stringBuilder.append(paramName); stringBuilder.append(" "); stringBuilder.append(error.getMessage()); stringBuilder.append("]"); } return Result.of(10002,false,"【參數校驗失敗】 " + stringBuilder.toString()); } /** * 未知異常 統一處理 */ @ExceptionHandler(value =Exception.class) @ResponseBody public Result exceptionHandler(Exception e){ e.printStackTrace(); return Result.of(10001,false,"【未知異常】 "+e.getMessage()); } }
測試controller
/** * 測試Controller */ @Validated @RestController @RequestMapping("/test/") public class Controller { /** * 新增用戶 */ @RequestMapping("addUser") public Result addUser(@Validated UserVoByAdd userVo){ System.out.println(userVo); return Result.of( "操作成功!"); } /** * 編輯用戶 */ @RequestMapping("editUser") public Result editUser(@Validated UserVoByEdit userVo){ System.out.println(userVo); return Result.of( "操作成功!"); } /** * 根據id查找用戶 */ @RequestMapping("findUserById") public Result findUserById(@Size(min = 1, max = 5,message = "id超出范圍") @NotEmpty(message = "id不能為空") String id) { System.out.println(id); return Result.of( "操作成功!"); } }
效果演示
addUser
http://localhost:10010/test/addUser
http://localhost:10010/test/addUser?id=123&name=張三&email=1111@qq.com&age=20&addr=南寧市
editUser
http://localhost:10010/test/editUser
http://localhost:10010/test/editUser?id=123&name=李四&age=20
findUserById
http://localhost:10010/test/findUserById
http://localhost:10010/test/findUserById?id=123
后記
springboot-validation參數校驗暫時先記錄到這,后續再進行補充。
代碼開源
代碼已經開源、托管到我的GitHub、碼雲: