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

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

public enum CommentContext {  
  STUDENT_FEEDBACK,
  STUDENT_QUESTION;
}

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

Я пытался использовать @JsonAlias, например:

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

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

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


person amy    schedule 24.07.2018    source источник
comment
Это похоже на ваше требование: stackoverflow.com/questions/9300191/? :)   -  person Tianhao Wang    schedule 25.07.2018


Ответы (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);
}
}

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

person GolamMazid Sajib    schedule 25.07.2018