首页 > 解决方案 > 在 Spring JPA 中反序列化枚举列表

问题描述

因此,我定义了一个模型,我希望将特定变量作为 ENUM。现在我已经像这样在模型中定义了它。

  @Type(
    type = "array",
    parameters = { @Parameter(name = ListArrayType.SQL_ARRAY_TYPE, value = "member_role") }
  )
  @Column(name = "access_roles", columnDefinition = "member_role[]")
  @Enumerated(EnumType.STRING)
  private List<ProjectMemberRole> accessRoles;

枚举是

@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public enum ProjectMemberRole {
  LEAD("lead", 4),
  COLLABORATOR("collaborator", 3),
  PARTICIPANT("participant", 2),
  VIEWER("viewer", 1);

  private final String value;
  private final Integer level;

  @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
  public static ProjectMemberRole forString(String value) {
    return stream(ProjectMemberRole.values())
      .filter(v -> v.value.equals(value))
      .findFirst()
      .orElse(null);
  }

  @Override
  @JsonValue
  public String toString() {
    return this.value;
  }
}

甚至。虽然我能够创建,但当我获取时出现此错误

"No enum constant project.model.ProjectMemberRole.collaborator; nested exception is java.lang.IllegalArgumentException: No enum constant project.model.ProjectMemberRole.collaborator"

因此,它似乎被序列化但没有被反序列化。在这种情况下我应该怎么做?

编辑:我正在检查我们是否有一个元素而不是一个数组。如果我们有一个值,那么它与 ENUM Name 一起使用,COLLABORATOR但如果我们将它作为 List 发送,那么它变成collaborator

所以出于某种原因,它正在为枚举保存 JSON 值。


  @Column(name = "access_roles")
  @Enumerated(EnumType.STRING)
  private ProjectMemberRole[] accessRoles;

  @Column(name = "access_role", columnDefinition = "text")
  @Enumerated(EnumType.STRING)
  private ProjectMemberRole accessRole;

标签: javaspringenumsspring-data-jpa

解决方案


在反序列化过程中,枚举通常被认为是大写的。您可以使用杰克逊启用它

objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS);

当你配置你的 ObjectMapper 时。


推荐阅读