使用枚举字段验证 POJO

Sag*_*wal 1 java validation spring java-8

我正在处理 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Ekl*_*vya 5

一种方法是编写用于枚举验证的自定义注释。并在现场使用它

@EnumNamePattern
private CardType cardType;
Run Code Online (Sandbox Code Playgroud)

自定义注释

@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 {};
}
Run Code Online (Sandbox Code Playgroud)

自定义注释验证器

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));
    }
}
Run Code Online (Sandbox Code Playgroud)