在春季要求中对枚举进行验证

时间:2018-09-04 05:52:02

标签: java spring validation spring-boot enums

我有一个请求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”的配置

2 个答案:

答案 0 :(得分:0)

Difference between @Size, @Length and @Column(length=value)

中所述
  

@Size 是Bean验证批注,用于验证   关联的 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; 
    

答案 1 :(得分:0)

我看不到需要大小验证。在请求中使用枚举的事实将迫使序列化将值映射到枚举可能的值之一。如果您将字符串json填充为“ invalid”作为工作人员类型,spring将会抛出:

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

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