javax.validation參數校驗


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測試接口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM