Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring请求中枚举的验证_Java_Spring_Validation_Spring Boot_Enums - Fatal编程技术网

Java spring请求中枚举的验证

Java spring请求中枚举的验证,java,spring,validation,spring-boot,enums,Java,Spring,Validation,Spring Boot,Enums,我有一个请求WorkerRequest,其中有一个enum,它有全职,经理等等 在WorkerRequest中,如何在此枚举上应用长度验证 示例:枚举类型不应大于8个字符 全职有效(8个字符) 永久性无效(9个字符) 当前如果我放置javax.validation.constraints.Size @Size(min = 0, max = 8, message = "Allowed length for workerType is 8.") @Enumerated(EnumType.ST

我有一个请求
WorkerRequest
,其中有一个
enum
,它有
全职
经理
等等

WorkerRequest
中,如何在此枚举上应用长度验证

示例:枚举类型不应大于8个字符

全职
有效(8个字符)

永久性
无效(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是一个Bean验证注释,用于验证 关联的字符串具有一个长度以最小值为界的值 和最大值

您只能指定在数据库中持久化枚举值所需的最大长度。例如,如果您定义
@Column(length=8)
而不是@Size,您将在db定义中相应地看到
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; 
    

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

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


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

    创建您自己的验证,并检查大小,不是enum_类型的大小,而是enum_类型的大小。name();当前,两个常量的
    enum_type.name()
    长度相同,为9个字符。与其重命名常量以匹配所需的长度,不如重写
    toString()
    ,并检查其长度或引入专用方法。@LuCio视情况而定。一旦它是一个字符串,就很容易过滤掉你不想考虑的下划线和其他字符。@Stultuske Ok。如果您只想在某个位置筛选枚举,而不想在枚举中定义它,那么这就是解决方法。在某些位置,您可能不希望进行验证,或者希望验证的行为有所不同。枚举本身不应该知道验证。例如,如果在MY_enum.isValid()上有一个枚举,它将返回false。。。。你为什么一开始就有那个枚举?