validation引數校驗器的使用
阿新 • • 發佈:2018-12-12
1.引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.在需要校驗的引數上加@Valid註解
@RequestMapping("/do_login") @ResponseBody public Result<Boolean> do_login(@Valid UserVo userVo){
3.在需要檢驗的引數類裡面加註解
@NotNull:引數不能為空
@Length(min = 32):引數長度最小32
@IsMobile:這個是我們自定義的引數,在後面進行具體編寫
package com.example.miaosha_xdp.VO; import lombok.ToString; import lombok.Getter; import lombok.Setter; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotNull; @Getter @Setter @ToString public class UserVo { @NotNull @IsMobile private String mobile; @NotNull @Length(min = 32) private String password; }
4.自定義一個引數校驗器
我們照貓畫虎,利用@NotNull這個註解為參考來定義一個自己的校驗器。
4.1檢視@NotNull的原始碼
/* * Bean Validation API * * License: Apache License, Version 2.0 * See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>. */ package javax.validation.constraints; import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.CONSTRUCTOR; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.ElementType.TYPE_USE; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.Target; import javax.validation.Constraint; import javax.validation.Payload; import javax.validation.constraints.NotNull.List; /** * The annotated element must not be {@code null}. * Accepts any type. * * @author Emmanuel Bernard */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Repeatable(List.class) @Documented @Constraint(validatedBy = { }) public @interface NotNull { String message() default "{javax.validation.constraints.NotNull.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; /** * Defines several {@link NotNull} annotations on the same element. * * @see javax.validation.constraints.NotNull */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Documented @interface List { NotNull[] value(); } }
4.2 複製到我們的校驗器裡面進行修修改改
裡面的IsMobileValidator.class是我們自己的引數校驗類,用來定義具體的校驗策略。我們在後面會進行編寫。
package com.example.miaosha_xdp.validator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* The annotated element must not be {@code null}.
* Accepts any type.
*
* @author Emmanuel Bernard
*/
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {IsMobileValidator.class})
public @interface IsMobile {
/**
* 預設可以為空
*
* @return
*/
boolean required() default false;
/**
* 校驗錯誤的提示資訊
* @return
*/
String message() default "手機號碼格式錯誤";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
4.3定義我們自己的校驗類
package com.example.miaosha_xdp.validator;
import com.example.miaosha_xdp.util.ValidatorUtil;
import org.springframework.util.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;
public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {
private boolean required = false;
/**
* 初始化方法
* 拿到我們的註解
*
* @param constraintAnnotation
*/
@Override
public void initialize(IsMobile constraintAnnotation) {
required = constraintAnnotation.required();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (required) {
return ValidatorUtil.isMobile(value);
}
if (StringUtils.isEmpty(value)) {
return true;
}
return ValidatorUtil.isMobile(value);
}
}