繁体   English   中英

验证弹簧请求中的枚举

[英]Validation on enum in spring request

我有一个请求WorkerRequest ,其中有一个enum ,其中包含FULL_TIMEMANAGER等。

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, ...}; 
  1. 定义自定义验证注释:

     @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(); }
  2. 实现一个验证器:

     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; } }
  3. 定义字段:

     @EnumSizeLimit (targetClassType = WorkerType.class, message = "your message" private String workerType;

我认为没有必要进行尺寸验证。 在请求中使用 enum 的事实将迫使序列化将值映射到 enum 可能值之一。 如果您将字符串 json 填充为 "invalid" 作为工作类型,spring 将抛出:

org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析错误:无法从字符串“无效”反序列化WorkerType类型的值:值不是声明的枚举实例名称之一:等等。

您可以在自定义休息异常处理程序中捕获异常

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM