Validator 使用總結

介紹

首先說下大家常用的hibernate-validator,它是對JSR-303/JSR-349標準的實現,然後spring爲了給開發者提供便捷集成了hibernate-validator,默認在springmvc模塊。

依賴

本文所介紹皆在springboot應用的基礎上,首先加上web模塊:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

可以查看其子依賴,發現web模塊默認使用了hibernate-validator:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
</dependency>

對實體類添加校驗

public class AgentTrustor implements Serializable,UniqueVerifiableVO {

    private static final long serialVersionUID = 4095871718305603749L;

    /**
     * 主鍵ID
     */
    @Id
    @ApiModelProperty(value="主鍵ID", required = true)
    private Integer fid;

    /**
     * 代理人代碼
     */
    @Length(min = 3,message = "代理人代碼位數至少三位")
    @Column(name = "ftrustor_id")
    @ApiModelProperty(value="代理人代碼", required = true)
    private String ftrustorId;
    /**
     * 聯繫人郵箱
     */
    @Email(message = "郵箱格式錯誤")
    @Column(name = "femail")
    @ApiModelProperty(value="聯繫人郵箱", required = true)
    private String femail;
}

通過註釋名即可推斷出校驗的內容,message用作校驗失敗時的提示信息。

對Rest層添加校驗

    @ApiOperation(value="新增", notes="")
    @PostMapping(value = "")
    //@Transactional(rollbackFor=Exception.class)
    public ObjectRestResponse<AgentTrustor> add(@RequestBody @Validated AgentTrustor agentTrustor) throws BaseException{
        agentTrustorBiz.bizInsertSelective(agentTrustor);
        return new ObjectRestResponse<AgentTrustor>().rel(true);
    }

統一異常的處理

經過對校驗異常的debug發現,該異常爲MethodArgumentNotValidException

MethodArgumentNotValidException

可以看到該異常對象的結構,同樣我們可以根據其結構解析出想要的結果:

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public BaseResponse validExceptionHandler(HttpServletResponse response,                     MethodArgumentNotValidException ex) {
        BindingResult bindingResult = ex.getBindingResult();
        StringBuffer stringBuffer = new StringBuffer();
        if(bindingResult.hasErrors()){
            for (FieldError fieldError : bindingResult.getFieldErrors()) {
                //該格式僅僅作爲response展示和log作用,前端應自己做校驗
                stringBuffer.append(fieldError.getObjectName() + "--" +                             fieldError.getDefaultMessage() + " ");
            }
        }
        logger.error(stringBuffer.toString());
        return new BaseResponse(HttpStatus.BAD_REQUEST.value(),stringBuffer.toString());
    }

上面代碼是統一異常處理中的一部分,主要是用來處理參數校驗產生的MethodArgumentNotValidException異常。

分組校驗

當我們遇到不同場景需要有不同的校驗規則時候,我們可以使用分組校驗。如:一個請求只校驗id,一個請求只校驗email:

public class AgentTrustor implements Serializable,UniqueVerifiableVO {

    private static final long serialVersionUID = 4095871718305603749L;

    /**
     * 主鍵ID
     */
    @Id
    @ApiModelProperty(value="主鍵ID", required = true)
    private Integer fid;

    /**
     * 代理人代碼
     */
    @Length(min = 3,message = "代理人代碼位數至少三位",groups = {ID.class})
    @Column(name = "ftrustor_id")
    @ApiModelProperty(value="代理人代碼", required = true)
    private String ftrustorId;
    /**
     * 聯繫人郵箱
     */
    @Email(message = "郵箱格式錯誤",groups = {EMAIL.class})
    @Column(name = "femail")
    @ApiModelProperty(value="聯繫人郵箱", required = true)
    private String femail;

    public interface ID{};

    public interface EMAIL{};
}

根據需要在@Validated屬性中指定需要校驗的分組名,可以指定1到多個。指定到的分組名會全部進行校驗,不指定的不校驗

@ApiOperation(value="新增", notes="")
    @PostMapping(value = "")
    //@Transactional(rollbackFor=Exception.class)
    public ObjectRestResponse<AgentTrustor> add(@RequestBody @Validated(AgentTrustor.ID.class) AgentTrustor agentTrustor) throws BaseException{
        agentTrustorBiz.bizInsertSelective(agentTrustor);
        return new ObjectRestResponse<AgentTrustor>().rel(true);
    }

API

JSR提供的校驗註解

@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,且長度必須大於0    
@Email  被註釋的元素必須是電子郵箱地址    
@Length(min=,max=)  被註釋的字符串的大小必須在指定的範圍內    
@NotEmpty   被註釋的字符串的必須非空    
@Range(min=,max=,message=)  被註釋的元素必須在合適的範圍內
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章