在对bean的属性进行校验的时候,经常会碰到下面这种情况:假设有这样一个属性,名为attr,我们需要它的可取值固定在一个枚举中。
举个例子:被校验的bean名为People,People中有一个String类型的属性sex,我们要求该属性的取值只能是"male"和"female"。
这种校验并不复杂,直接看代码好了。
- 被校验的属性
/**
* 合伙人类型: 1-企业 2-个人
*/
@IsValidPartnerType
private Integer type;
@IsValidPartnerType是我们自定义的约束
- 自定义的枚举类型的约束
@Target({FIELD, PARAMETER, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IsValidPartnerTypeConstraintValidator.class)
public @interface IsValidPartnerType {
String message() default "非法的合伙人类型";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
IsValidPartnerTypeConstraintValidator是校验的具体实现
- 校验的具体实现
public class IsValidPartnerTypeConstraintValidator
implements ConstraintValidator<IsValidPartnerType, Integer> {
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
if (Objects.isNull(value)) {
return true;
}
return UserType.isValidPartnerType(value);
}
}
核心的校验逻辑在枚举UserType中实现
- 枚举定义
@Getter
@AllArgsConstructor
public enum UserType {
/**
* 用户是企业
*/
COMPANY(1, "企业"),
/**
* 用户是个人
*/
PERSON(2, "个人");
private Integer code;
private String desc;
public boolean match(final Integer code) {
return this.getCode().equals(code);
}
/**
* 是否是合法的用户类型
*
* @param code 用户类型
* @return 是否合法
*/
public static boolean isValidPartnerType(final Integer code) {
for (UserType item : values()) {
if (item.getCode().equals(code)) {
return true;
}
}
return false;
}
}
最终的实现效果就是:被校验的属性 ---- type 的取值只能是 1 或者 2 ,否则校验不通过。