java - 在春季请求中验证枚举
问题描述
我有一个请求WorkerRequest
,其中有一个enum
which has FULL_TIME
,MANAGER
依此类推。
WorkerRequest
如何在此枚举上应用长度验证?
示例:枚举类型不应大于 8 个字符。
FULL_TIME
有效(8 个字符)
PERMANENT
无效(9 个字符)
目前,如果我把javax.validation.constraints.Size
@Size(min = 0, max = 8, message = "Allowed length for workerType is 8.")
@Enumerated(EnumType.STRING)
private WorkerType workerType;
它抛出一个错误:
HV000030:找不到约束“javax.validation.constraints.Size”验证类型“com.XX.XX.XX.WorkerType”的验证器。检查“workerType”的配置
解决方案
如@Size、@Length 和 @Column(length=value) 之间的差异中所述
@Size是一个 Bean Validation 注解,用于验证关联的String是否具有长度受最小值和最大值限制的值。
您只能指定在数据库中持久化枚举值所需的最大长度。例如,如果您定义@Column(length = 8)
而不是 @Size,您将workerType VARCHAR(8)
在您的数据库定义中看到相应的。
但是有一个解决方法:假设你有
public enum WorkerType {PERMANENT , FULL_TIME, ...};
定义一个自定义验证注解:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = EnumSizeLimit.class) public @interface EnumSizeLimit { String message() default "{com.example.app.EnumSizeLimit.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; Class<? extends Enum<?>> targetClassType(); }
实现一个验证器:
public class EnumSizeLimitValidator implements ConstraintValidator < EnumSizeLimit , String > { private Set < String > allowedValues; @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void initialize(EnumSizeLimit targetEnum) { Class << ? extends Enum > enumSelected = targetEnum.targetClassType(); allowedValues = (Set < String > ) EnumSet.allOf(enumSelected).stream().map(e - > ((Enum << ? extends Enum << ? >> ) e).name()) .collect(Collectors.toSet()); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { return value == null || (value.length>=0 && value.length<=8)) ? true : false; } }
定义字段:
@EnumSizeLimit (targetClassType = WorkerType.class, message = "your message" private String workerType;
推荐阅读
- javascript - 如何根据键值项列表更新现有的嵌套对象属性
- c# - 如何删除从ckeditor下载的word文档中的htmltags
- vue.js - 是否有可能获得引用的元素,即。this.$ref 在 fullCalendar 中的 dateClick 函数内?
- r - 注释绘图边缘而不更改绘图限制或将“扩展”设置为 0
- wordpress - 在 wordpress 和 pagebuilders 上缓存
- flutter - 如何修复 pub get failed (66; 无法解压缩 gz 流连接在接收数据时关闭,路径 = '')
- wso2 - WSO2 - log4j 配置以避免 DependencyTracker 消息
- dart - 列出与为 linter 中的规则分配真实值之间的区别
- resources - 容器资源限制在 Kubernetes 中的工作原理
- docker - Docker - 这些将被记录在哪里