首页 > 解决方案 > 使用枚举字段验证 POJO

问题描述

我正在使用 POJO 的 spring 和 spring 验证。

在 POJO 内部,我有一些字段的值将映射到特定的ENUM类。

正如下面的代码中提到的,我有 cardType 字段为CardType ENUM.

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.Max;

@Data
@SuperBuilder(toBuilder = true)
@RequiredArgsConstructor
@EqualsAndHashCode
class SamplePOJO {

    private String cardType;

    @Length(max = 20)
    private String name;

    @Max(10)
    private int number
}

public enum CardType {
VISA, MASTER;
}

对于姓名和号码,我可以使用@Max and @Length。我如何为将属于提到的 cardType 应用验证enum。同样在将来,我可能还需要检查List 值。所以如果有人可以指导我。

标签: javaspringvalidationjava-8

解决方案


一种方法是为枚举验证编写自定义注释。并在球场上使用

@EnumNamePattern
private CardType cardType;

自定义注释

@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = EnumNamePatternValidator.class)
public @interface EnumNamePattern {
    String message() default "invalid";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

自定义注释验证器

public class EnumNamePatternValidator implements ConstraintValidator<EnumNamePattern, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) return true; 
        return Arrays.stream(CardType.values()).anyMatch(e -> e.name().equals(value));
    }
}

推荐阅读