验证弹簧请求中的枚举

Meh*_*lik 5 java validation enums spring spring-boot

我有一个请求WorkerRequest,其中有一个enumwhich has 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;
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误:

HV000030:找不到约束“javax.validation.constraints.Size”验证类型“com.XX.XX.XX.WorkerType”的验证器。检查“workerType”的配置

Moh*_*and 3

如@Size、@Length 和 @Column(length=value) 之间的差异中所述

@Size是一个 Bean Validation 注解,用于验证关联的String是否具有长度受最小值和最大值限制的值。

您只能指定在数据库中保留枚举值所需的最大长度。例如,如果您定义@Column(length = 8)而不是@Size,您将workerType VARCHAR(8)在数据库定义中看到相应的信息。

但有一个解决方法:假设你有

 public enum WorkerType {PERMANENT , FULL_TIME, ...}; 
Run Code Online (Sandbox Code Playgroud)
  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();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 定义字段:

    @EnumSizeLimit (targetClassType = WorkerType.class, message = "your message" 
    private String workerType; 
    
    Run Code Online (Sandbox Code Playgroud)