Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 Boot-字符串到枚举的转换接受枚举的值和索引。如何拒绝数字输入而只接受枚举值?_Java_Spring_Spring Boot_Enums - Fatal编程技术网

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

Java Spring Boot-字符串到枚举的转换接受枚举的值和索引。如何拒绝数字输入而只接受枚举值?,java,spring,spring-boot,enums,Java,Spring,Spring Boot,Enums,我有一些简单的枚举,如下所示 public enum Status { ACTIVE, PASSIVE; private Status() { } } 我的REST服务输入对象中有一个字符串状态字段 当服务接收到两个请求时,它将其转换为被动 案例1 状态=1 { "name": "Walter", "surname": "White" "status":

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

public enum Status {
  ACTIVE,
  PASSIVE;

  private Status() {
  }
}
我的REST服务输入对象中有一个字符串状态字段

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

案例1 状态=1

{
    "name": "Walter",
    "surname": "White"
    "status": "1"
}
案例2 status=“PASSIVE”

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

我希望它只接受非数字值,就像在案例2中一样

也考虑到我有很多这样的枚举,我想把限制应用到我所有的枚举中。


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

更新:

默认情况下,枚举的编号通过映射枚举序号反序列化。在ObjectMapper中将配置添加为true,默认情况下为false

@Configuration
public class JacksonConfig {

  @Bean
  @Primary
  public ObjectMapper configureObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, true);
    return objectMapper;
  }
}

另一种方法是编写用于枚举验证的自定义注释。并在具有可能值的字段上使用它

@EnumNamePattern
private Status status;
用于枚举验证的自定义批注

@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = EnumNamePatternValidator.class)
public @interface EnumNamePattern {
    String message() default "invalid";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
@Target({方法、字段、注释\类型、构造函数、参数、类型\使用})
@保留(运行时)
@记录
@约束(validatedBy=EnumNamePatternValidator.class)
public@interface枚举模式{
字符串消息()默认为“无效”;
类[]组()默认值{};
类别>{
@凌驾
公共布尔值有效(枚举值、ConstraintValidatorContext上下文){
if(value==null)返回true;
返回Arrays.stream(Status.values()).anyMatch(e->e.name().equals(value.name());
}
}

如果我使用此解决方案,当向枚举添加新值时,我必须更新引用枚举的所有参数的regexp。是否有一种通用方法拒绝所有枚举的数值。这就是我不想应用此方法的原因。因为它不可维护。我最好应用一个更简单的解决方案。谢谢您的回答。我是我很高兴,但我仍在寻找一个不同的解决方案。顺便说一句,我想在Strin到Enum转换期间拒绝值。我不需要过滤Enum值。我想在我的示例中停止将1转换为被动的操作。@cavo我认为重置配置是最简单的解决方案。JacksonConfig是我一直在寻找的。我还使用了全局异常处理ler返回异常的根本原因。非常感谢。
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = EnumNamePatternValidator.class)
public @interface EnumNamePattern {
    String message() default "invalid";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
public class EnumNamePatternValidator implements ConstraintValidator<EnumNamePattern, Enum<?>> {
    @Override
    public boolean isValid(Enum<?> value, ConstraintValidatorContext context) {
        if (value == null) return true;
        return Arrays.stream(Status.values()).anyMatch(e -> e.name().equals(value.name()));
    }
}