提问者:小点点

spring boot-字符串到枚举的转换接受枚举的值和索引。 如何拒绝数字输入而只接受枚举值?


我有一些简单的枚举,如下所示。

public enum Status {
  ACTIVE,
  PASSIVE;

  private Status() {
  }
}

我的REST服务输入对象中有一个String status字段。

当服务接收到这两个请求时,它将其转换为被动的。

情况1状态=1

{
    "name": "David",
    "surname": "White"
    "status": "1"
}

情况2状态=“被动”

{
    "name": "David",
    "surname": ""
    "status": "PASSIVE"
}

我不希望默认转换器接受数字输入(情况1)。 我的意思是,我不希望它通过使用枚举的索引,将1转换为被动。

我只想用案例2。

还要考虑我有许多这样的枚举,并且我希望将限制应用到我的所有枚举。

我怎样才能使它像我上面解释的那样工作呢?


共1个答案

匿名用户

您需要为枚举验证编写一个自定义注释。 并在字段中使用可能的值

@EnumNamePattern(regexp = "ACTIVE|PASSIVE")
private Status status;

枚举验证的自定义批注

@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = EnumNamePatternValidator.class)
public @interface EnumNamePattern {
    String regexp();
    String message() default "must match \"{regexp}\"";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

并为注释编写验证器

public class EnumNamePatternValidator implements ConstraintValidator<EnumNamePattern, Enum<?>> {
    private Pattern pattern;
 
    @Override
    public void initialize(EnumNamePattern annotation) {
        try {
            pattern = Pattern.compile(annotation.regexp());
        } catch (PatternSyntaxException e) {
            throw new IllegalArgumentException("Given regex is invalid", e);
        }
    }
 
    @Override
    public boolean isValid(Enum<?> value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        Matcher m = pattern.matcher(value.name());
        return m.matches();
    }
}

这里,注释是以一种通用的方式编写的,您也可以将其修改为仅支持status