1、pom.xml文件中先引入一下依賴
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.0.Final</version> </dependency>
2、常用的注解
@Null 被注釋的元素必須為 null @NotNull 被注釋的元素必須不為 null @AssertTrue 被注釋的元素必須為 true @AssertFalse 被注釋的元素必須為 false @Min(value) 被注釋的元素必須是一個數字,其值必須大於等於指定的最小值 @Max(value) 被注釋的元素必須是一個數字,其值必須小於等於指定的最大值 @DecimalMin(value) 被注釋的元素必須是一個數字,其值必須大於等於指定的最小值 @DecimalMax(value) 被注釋的元素必須是一個數字,其值必須小於等於指定的最大值 @Size(max=, min=) 被注釋的元素的大小必須在指定的范圍內 @Digits (integer, fraction) 被注釋的元素必須是一個數字,其值必須在可接受的范圍內 @Past 被注釋的元素必須是一個過去的日期 @Future 被注釋的元素必須是一個將來的日期 @Pattern(regex=,flag=) 被注釋的元素必須符合指定的正則表達式 Hibernate Validator提供的校驗注解: @NotBlank(message =) 驗證字符串非null,且trim后長度必須大於0 @Email 被注釋的元素必須是電子郵箱地址 @Length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內 @NotEmpty 被注釋的字符串的必須非空 @Range(min=,max=,message=) 被注釋的元素必須在合適的范圍內 @AssertFalse 校驗false @AssertTrue 校驗true @DecimalMax(value=,inclusive=) 小於等於value, inclusive=true,是小於等於 @DecimalMin(value=,inclusive=) 與上類似 @Max(value=) 小於等於value @Min(value=) 大於等於value @NotNull 檢查Null @Past 檢查日期 @Pattern(regex=,flag=) 正則 @Size(min=, max=) 字符串,集合,map限制大小 @Valid 對po實體類進行校驗
如需其他注解,請參考hibernate validator官方文檔了解其他驗證約束注解和進行自定義的驗證約束注解定義。
3、項目中引用
首先在需要驗證的實體類前添加注解 @Valid
@PostMapping("admin/category/add") @ResponseBody public ApiRestResponse addCategory(HttpSession session, @Valid @RequestBody AddCategoryReq addCategoryReq) { User user=(User)session.getAttribute(Constant.IMOOC_MALL_USER); if(user == null) { return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_LOGIN); } boolean checkAdminRole = userService.checkAdminRole(user); if(checkAdminRole) { //管理員 categoryService.add(addCategoryReq); return ApiRestResponse.success(); }else { return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_ADMIN); } }
然后在對應的實體中,根據需求添加需要的注解(具體需要哪些注解參考第二條)
public class AddCategoryReq { @Size(min=2,max=5) @NotNull(message="名稱不能為空") private String name; @Max(3) @NotNull(message="類型不能為空") private Integer type; @NotNull(message="parentId不能為空") private Integer parentId; @NotNull(message="orderNum不能為空") private Integer orderNum; //省略了get set方法 }
4,處理異常,優雅的提示給用戶
@ControllerAdvice public class GlobalExceptionHandler { private final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public ApiRestResponse handleMethodArgumentNotValidException( MethodArgumentNotValidException e) { log.error("MethodArgumentNotValidException: ", e); return handleBindingResult(e.getBindingResult()); } private ApiRestResponse handleBindingResult(BindingResult result) { //把異常處理為對外暴露的提示 List<String> list = new ArrayList<>(); if (result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); for (ObjectError objectError : allErrors) { String message = objectError.getDefaultMessage(); list.add(message); } } if (list.size() == 0) { return ApiRestResponse.error(ImoocMallExceptionEnum.REQUEST_PARAM_ERROR); } return ApiRestResponse .error(ImoocMallExceptionEnum.REQUEST_PARAM_ERROR.getCode(), list.toString()); } }
枚舉類信息:
public class ImoocMallException extends RuntimeException{ private final Integer code; private final String message; /** * @param code * @param message */ public ImoocMallException(Integer code, String message) { this.code = code; this.message = message; } public ImoocMallException(ImoocMallExceptionEnum enumInfo) { this(enumInfo.getCode(),enumInfo.getMsg()); } /** * @return the code */ public Integer getCode() { return code; } /** * @return the message */ public String getMessage() { return message; } } public enum ImoocMallExceptionEnum { NEED_USER_NAME(10001,"用戶名不能為空!"), NEED_PASSWORD(10002,"密碼不能為空!"), PASSWORD_TO_SHORT(10003,"密碼不能少於8位!"), NAME_EXISTED(10004,"不允許重名!"), INSTER_FAILED(10005,"數據插入失敗!"), WRONG_PASSWORD(10006,"密碼錯誤!"), NEED_LOGIN(10007,"用戶未登錄!"), UPDATE_FAILED(10008,"更新失敗!"), NEED_ADMIN(10009,"無管理員權限!"), PARA_NOT_NULL(10010,"參數不能為空!"), CREATE_FAILED(10011,"新增失敗!"), REQUEST_PARAM_ERROR(10012, "參數錯誤"), SYSTEM_ERROR(20000,"系統異常!") ; //異常狀態碼 Integer code; //異常信息 String msg; /** * @param code * @param msg */ private ImoocMallExceptionEnum(Integer code, String msg) { this.code = code; this.msg = msg; } /** * @return the code */ public Integer getCode() { return code; } /** * @param code the code to set */ public void setCode(Integer code) { this.code = code; } /** * @return the msg */ public String getMsg() { return msg; } /** * @param msg the msg to set */ public void setMsg(String msg) { this.msg = msg; } }
5,使用postman測試接口