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

标签 java spring spring-boot enums

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

public enum Status {
  ACTIVE,
  PASSIVE;

  private Status() {
  }
}

我的 REST 服务输入对象中有一个字符串状态字段。

当服务收到两个请求时,它会将其转换为 PASSIVE。

案例1 状态 = 1

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

案例2 状态=“被动”

{
    "name": "Walter",
    "surname": "White"
    "status": "PASSIVE"
}

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

我希望它只接受非数值,就像案例 2 中那样。

还要考虑到我有很多这样的枚举,我想将限制应用于我的所有枚举。

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

最佳答案

更新:

默认情况下,枚举的 Number 通过映射枚举序数进行反序列化。添加配置DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS在 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 {};
}

并为注释编写 validator

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()));
    }
}

关于java - Spring Boot - 字符串到枚举的转换接受枚举的值和索引。如何拒绝数字输入并仅接受枚举值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62730255/

相关文章:

使用命名参数的 Spring BatchSqlUpdate 与 NamedParameterJdbcTemplate

java - @ConfigurationProperties 构造函数绑定(bind)在 2.2.0.RC1 中不起作用

java - 在 keyPressed 事件上显示 jlabell 中的 jtextfield 数据

java - 从 MySql 切换到内存数据库进行测试时,解决这些 Hibernate 异常的最佳方法是什么?

java - 基本 AOP 程序抛出 BeanCurrentlyInCreationException

Spring Boot不等待请求

java - 无法在 Spring Boot 1.4 中扩展 WebMvcAutoConfigurationAdapter

java - Web应用程序中的内存泄漏,tomcat+hibernate+Guice

java - Hibernate:如何建模双重父/子关系

java - Spring aop中@Before @After和@AfterExecution有什么区别