gpt4 book ai didi

java - 在 Spring 请求中验证枚举

转载 作者:行者123 更新时间:2023-11-30 06:01:40 25 4
gpt4 key购买 nike

我有一个请求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: No validator could be found for constraint 'javax.validation.constraints.Size' validating type 'com.XX.XX.XX.WorkerType'. Check configuration for 'workerType'

最佳答案

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

@Size is a Bean Validation annotation that validates that the associated String has a value whose length is bounded by the minimum and maximum values.

您只能指定在数据库中保留枚举值所需的最大长度。例如,如果您定义 @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. 实现 validator :

    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;

关于java - 在 Spring 请求中验证枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52159569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com