在寫一些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 private LocalDate dateOfBirth;
沒有英漢互譯結果
請嘗試網頁搜索
請嘗試網頁搜索