spring 參數校驗

原文鏈接:https://www.cnblogs.com/codeingthink/p/9237825.html

spring 參數校驗註解

在寫一些controller協議的時候,有些時候從前端傳過來的參數較多,好的辦法是定義一個實體類來封裝請求參數,但是用實體類封裝參數後,無法對參數值進行校驗,可以使用spring的@Validated 結合java validation、hibernate validation註解進行校驗。

 

1.@validated 註解

@Validated is org.springframework.validation.annotation.Validated

  @RequestMapping(value = "/regist", method = {RequestMethod.GET, RequestMethod.POST})
    @ResponseBody
    public Object hualalaRegist(@Validated HualalaRegistVO registVO, BindingResult bindingResult,
                                HttpServletRequest request) throws Exception {
        if(bindingResult.hasErrors())
            return new ResultBean<>(HttpStatus.SC_BAD_REQUEST,"請求參數錯誤",null);

    ...
    }

增加@Validated 註解後,表示需要對其中的參數進行校驗。

2.java validation 註解

複製代碼

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=)  被註釋的元素必須符合指定的正則表達式    

 

3.hiberate validation 註解

 

@Email  被註釋的元素必須是電子郵箱地址    
@Length(min=,max=)  被註釋的字符串的大小必須在指定的範圍內    
@NotEmpty   被註釋的字符串的必須非空    
@Range(min=,max=,message=)  被註釋的元素必須在合適的範圍內
@URL(protocol=,
host=,    port=, 
regexp=, flags=)  合法的url

 

主要區分下@NotNull  @NotEmpty  @NotBlank 3個註解的區別:

@NotNull           任何對象的value不能爲null

@NotEmpty       集合對象的元素不爲0,即集合不爲空,也可以用於字符串不爲null

@NotBlank        只能用於字符串不爲null,並且字符串trim()以後length要大於0

 

4. 案例

HualalaRegistVO.java

 

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.math.BigDecimal;

/***
 * @Author: jiyang
 * @Date: 2018-06-27 13:48
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HualalaRegistVO {

    @NotBlank
    @Pattern(regexp = "^\\d{11}$", message = "手機號碼格式錯誤")
    String phoneNumber; //手機號碼

    @NotBlank
    String name; //姓名

    @NotBlank
    String loanBody;//借款主體

    @NotBlank
    String loanBodyId;//借款主體ID

    @NotNull
    BigDecimal borrowAmount;//借款金額

    @NotNull
    BigDecimal turnover;//月營業額

    @NotNull
    BigDecimal profit; //月利潤

    @NotBlank
    String usage;//用途
    @NotBlank(groups = {A.clss})
    String groupID;//集團ID

    String source = ""; //來源

    String code; //驗證碼(更換手機號碼時使用)

    String ipAddress; //ip地址

   // 定義兩個域
    public Interface {}
   
     public Interface{}

}

 

controller

 

@RequestMapping(value = "/regist", method = {RequestMethod.GET, RequestMethod.POST})
    @ResponseBody
    public Object hualalaRegist(@Validated({HualalaRegistVO.A.class}) HualalaRegistVO registVO, BindingResult bindingResult,
                                HttpServletRequest request) throws Exception {
        if(bindingResult.hasErrors())
            return new ResultBean<>(HttpStatus.SC_BAD_REQUEST,"請求參數錯誤",null);

        if (!"dev".equals(profile)) {
            registVO.setPhoneNumber(LongdaiUtil.decrypt(registVO.getPhoneNumber()));
            registVO.setGroupID(LongdaiUtil.decrypt(registVO.getGroupID()));
        }

        registVO.setIpAddress(NetworkUtil.getIpAddress(request));
        return hualalaService.hualalaRegist(registVO);
    }

複製代碼

 

5. custom validation

複製代碼

@Documented
@Retention(RUNTIME)
@Target({FIELD, ANNOTATION_TYPE, PARAMETER})
@Constraint(validatedBy = AdultValidator.class)
public @interface Adult {
    String message() default "{adult}";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

 

@Component
public class AdultValidator implements ConstraintValidator<Adult, LocalDate> {
    private static final int ADULT_AGE = 18;

    @Override
    public boolean isValid(LocalDate dateOfBirth, ConstraintValidatorContext constraintValidatorContext) {
        return dateOfBirth != null && LocalDate.now().minusYears(ADULT_AGE).isAfter(dateOfBirth);
    }
}

 

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