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

  1. 案例
    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);
}

復制代碼

  1. 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
    private LocalDate dateOfBirth;


免責聲明!

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



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