java - 使用枚举字段验证 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
值。所以如果有人可以指导我。
解决方案
一种方法是为枚举验证编写自定义注释。并在球场上使用
@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));
}
}
推荐阅读
- rasa-nlu - 后备意图破坏了我在 Rasa 中的表单,如何解决?
- c++ - C ++:在结构中初始化模板变量
- android - 如何在android studio自定义视图中为底部Mac栏绘制曲线
- design-patterns - 将微服务称为只是一个适配器的项目是否正确?
- git - 如何分叉、创建分支和 jupyter 笔记本?
- mysql - 安装 SQL 问题 - “您的用户 'root' 连接到本地主机上的 MYSQL 服务器的尝试失败:-3306
- jquery - jquery:AJAX加载后滚动到底部
- firebase-hosting - Firebase 托管为 Cloud Run 增加了约 450 毫秒的延迟开销
- python - 如何检索使用 django allauth 和 django-rest-auth 和 django rest 框架生成的令牌
- c - C二叉树删除不起作用按顺序打印导致无限递归