SpringBoot-MVC之驗證框架JSR

1、SpringBoot支持JSR-303Bean驗證框架,默認使用Hibernate validator。在springMvc中,只需要使用註解標註在方法參數中,SpringBoot可對參數對象進行校驗,校驗結果放在BindingResult中。

2、JSR-303

       (1)JSR-303是java標準的驗證框架,已有的實現由Hibernate validate。常用註解有以下幾種

空檢查

    @Null 驗證對象是否爲空

    @NotNull 驗證對象不爲空

    @NotBlank 驗證不爲空字符串,""和" "都會失敗

    @NotEmpty 驗證對象不爲null,或者集合不爲空

長度檢查

@Size(min = ,max = )驗證對象長度,可支持字符串、集合
@Length 字符串大小

數值檢測

  @Min驗證是否大於等於指定的值

@Max驗證是否小於等於指定的值

@Digits驗證是否符合指定格式,如@Digits(integer=9,fraction=2)

@Range驗證是否在指範圍內,如@range(min=1,max=1000)

其他

@Email,驗證是否爲郵件格式,爲null不做校驗

@Pattern,驗證String是否符合正則表達式

(2)在一些其他的應用場景,不同的業務邏輯會有不同的業務需求,比如當更新的時候,id必須爲null,但增加的時候,id必須爲null。

   在JSR-303中定義了group,每個校驗註解必須支持。可以匹配一個或者多個group

(3)使用場景

package com.blog.pojo;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Pattern;

/**
 * @author admin
 * @date 2018/10/9
 */

public class TbItemCatModel {

    public interface Add {
    }

    public interface Update {
    }

    @Null(groups = {Add.class})
    @NotNull(groups = Update.class)
    private Long id;
@
    private Long parentId;
    @Pattern(regexp = "0-9a-zA-Z", message = "只能爲字母或數字")
    private String name;
    private Long TypeId;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getTypeId() {
        return TypeId;
    }

    public void setTypeId(Long typeId) {
        TypeId = typeId;
    }
}

(2)contronller攔截

@RequestMapping(value = "/addItemCat")
public void addItemCat(@Validated({TbItemCatModel.Update.class}) TbItemCatModel itemCatModel, BindingResult result) {
    if (result.hasErrors()) {
        List<ObjectError> allErrors = result.getAllErrors();
        FieldError fieldError = (FieldError) allErrors.get(0);
        System.out.println(fieldError.getObjectName() + fieldError.getField() + fieldError.getDefaultMessage());
        return;
    }
    return;

}

3、自定義校驗

(1)

package com.blog.annotion;


import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

//Constraint表示用什麼類作爲註解實現類
@Constraint(validatedBy = {WorkTimeValidator.class})

@Documented
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface WorkOverTime {
    //用於創建錯誤信息,
    String message() default "加班時間過長,不能超過{max}小時";

    int max() default 5;

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default{};

}

(2)

package com.blog.annotion;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author admin
 * @date 2018/10/30
 */

public class WorkTimeValidator implements ConstraintValidator<WorkOverTime, Integer> {
    WorkOverTime work;
    int max;

    @Override
    public void initialize(WorkOverTime work) {
        this.work = work;
        max=work.max();
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        return value < max;

    }
}
(3)
package com.blog.pojo;

import com.blog.annotion.WorkOverTime;
import org.apache.ibatis.annotations.Update;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Pattern;

/**
 * @author admin
 * @date 2018/10/9
 */

public class TbItemCatModel {

    /*public interface Add {
    }

    public interface Update {
    }

    @Null(groups = {Add.class})*/
    @NotNull//(groups = Update.class)
    private Long id;

    private Long parentId;
    @Pattern(regexp = "0-9a-zA-Z", message = "只能爲字母或數字")
    private String name;
    private Long TypeId;
    @WorkOverTime(max=2)
    private int workTime;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getTypeId() {
        return TypeId;
    }

    public void setTypeId(Long typeId) {
        TypeId = typeId;
    }

    public int getWorkTime() {
        return workTime;
    }

    public void setWorkTime(int workTime) {
        this.workTime = workTime;
    }
}

(4)

@RequestMapping(value = "/addItemCat")
public void addItemCat(@Validated
                       @RequestBody TbItemCatModel itemCatModel, BindingResult result) {
    if (result.hasErrors()) {
        List<ObjectError> allErrors = result.getAllErrors();
        FieldError fieldError = (FieldError) allErrors.get(0);
        System.out.println(fieldError.getObjectName() + fieldError.getField() + fieldError.getDefaultMessage());
        return;
    }
    return;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章