1. 程式人生 > >spring mvc 參數校驗

spring mvc 參數校驗

efault ror span font exc exce default 地方 doc

                  spring mvc中的參數校驗

spring mvc 支持jsr-303 Bean驗證框架,默認實現是使用的Hibernate validator。在spring mvc中只需要使用@Validated註解在方法參數上即可對參數對象進行校驗。校驗結果放在BindingResult中,所以每個被校驗的參數後面都需要放一個BindingResult。

因為有時候並不是所有的地方需要的驗證都是一樣的,例如更新的時候需要id notnull,而插入的時候確需要id為null,所以驗證的時候在每個驗證條件中都增加了groups屬性,用於標識需要哪種校驗,而在@validated中可以設置vlue屬性,用於和驗證條件中的groups配合使用,只有@Validated中的value類型和驗證註解中的groups屬性一致的時候才進行校驗。

JSR-303提供的常用的校驗註解主要有以下幾類 

空類型檢查
@Null驗證對象必須為空

@NotNull驗證對象不能為空

@NotBlank 驗證對象不能為空字符串

@NotEmpty 驗證對象不能為空,集合類型不能為空


長度檢查
@Size(min= ,max=) 驗證對象長度,支持字符串和集合

@Length 驗證字符串長度


數值檢查
@Max 驗證數字大小是否小於某個數值

@Min 驗證數字大小是否大於某個數值

@Digits 驗證數字是否符合某個格式例如:整數3為,小數2位

@Range 驗證數值是否在某個範圍之內


其他檢查
@Email 驗證是否位郵件格式,若為null則不做校驗

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

例子

  在controller中使用@Validated註解

    

 1 @Controller
 2 @RequestMapping("valid")
 3 @Slf4j
 4 public class ValidateController {
 5 
 6     private static final String BASE_PATH = "/valid/";
 7 
 8     @RequestMapping("index")
 9     public String index(@Validated() Student student,BindingResult result){
10 if(result.hasErrors()){ 11 StringBuffer sb = new StringBuffer(); 12 List<FieldError> errorList = result.getFieldErrors(); 13 errorList.stream().forEach(error->{ 14 String message = error.getDefaultMessage(); 15 String field = error.getField(); 16 sb.append(field).append(":").append(message).append(","); 17 }); 18 log.error(sb.toString()); 19 } 20 21 return BASE_PATH + "index"; 22 } 23 }

    在bean中使用驗證註解

@Data
public class Student {

    @Length(max = 32,min = 32,groups = {})
    private String id;

    @NotNull
    @Size(max = 50)
    private String name;

    @Max(100)
    @Min(12)
    @NotNull
    private Integer age;

    @Email
    @NotNull
    private String email;

    @AssertFalse
    private Boolean isLeader;

    @WorkOverTime
    private String workOverTime;
}

  這樣在前臺請求該方法的時候就會進行自動校驗。而校驗結果會保存在BindingResult中。可以通過hasErrors判斷校驗是否通過,getFieldErrors可以獲取所有的錯誤。

自定義參數校驗

  有的時候自帶的參數校驗類型並不能滿足我們的需求,這時我們可以自定校驗註解。

  定義自定義註解類:

    

@Constraint(validatedBy = {ValidatedWorkOverTime.class})
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface WorkOverTime {

    String message() default "加班時長不能超過{max}小時";

    int max() default 5;

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

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

在這個類中我們使用Constraint註解聲明我們需要使用哪個類來進行具體的驗證。

註解類中必須包含1.錯誤信息。即message方法,2.驗證規則分組,即gourps方法,3.驗證的有效負荷即payload方法。

我們還必須實現一個類來進行具體的驗證。即上面Constraint聲明的類。

@Slf4j
public class ValidatedWorkOverTime implements ConstraintValidator<WorkOverTime,Object> {

    private Integer max;

    private WorkOverTime workOverTime;

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

    @Override
    public boolean isValid(Object integer, ConstraintValidatorContext constraintValidatorContext) {
        Integer overWorkTime = Integer.MAX_VALUE;
        if(integer instanceof Integer){
            overWorkTime = (Integer) integer;
        }else{
            try {
                overWorkTime = Integer.parseInt(integer.toString());
            }catch (Exception e){
                log.error(e.toString(),e);
                if(e instanceof NumberFormatException){

                }
            }
        }
        return max>overWorkTime;
    }
}

這樣我們就可以在bean中的屬性中使用@WorkOverTime註解來進行參數校驗了。

spring mvc 參數校驗