Как десериализовать альтернативные значения для поля enum из JSON-запроса REST API?

Модель запроса REST API имеет одно поле перечисления:

public enum CommentContext {  
  STUDENT_FEEDBACK,
  STUDENT_QUESTION;
}

Теперь я хочу удалить префикс STUDENT_ из значения enum, но не нарушая существующие вызовы API.

Я пытался использовать @JsonAlias, вот так:

public enum CommentContext {
   @JsonAlias ("{FEEDBACK, STUDENT_FEEDBACK}")
   FEEDBACK,
   @JsonAlias ("{QUESTION, STUDENT_QUESTION}")
   COMMENT;
}

Но API завершается с ошибкой 400 Bad Request, когда STUDENT_FEEDBACK передается как значение этого поля перечисления в запросе JSON.

Можно ли десериализовать этот объект CommentContext из JSON для любого из альтернативных значений этого поля перечисления, таких как FEEDBACK или STUDENT_FEEDBACK?

1 ответ

Вы можете сделать это используя @JsonCreator. Здесь я дал решение для вашей проблемы:

public enum CommentContext {
STUDENT_FEEDBACK,
STUDENT_QUESTION;

@JsonCreator
public static CommentContext setValue(String key){
    Optional<CommentContext> commentContext = Arrays.stream(CommentContext.values())
            .parallel()
            .filter(ct -> ct.toString().equals(key) || ct.toString().substring(8).equals(key))
            .findAny();
    return commentContext.orElse(null);
}
}

Вы также можете увидеть эту ссылку

Другие вопросы по тегам