Реализовать миграцию JSON-поля с сохранением обратной совместимости

6. Переименовать JSON-поле с сохранением обратной совместимости

Условие задачи:
Необходимо изменить название поля в JSON с title на name, сохранив обратную совместимость.

Старые клиенты должны продолжать отправлять:

{
  "title": "..."
}

Новые клиенты должны использовать:

{
  "name": "..."
}

При сериализации ответа необходимо использовать новое название name.


Спойлеры к решению

Подсказки
💡 Новое основное имя поля можно задать через @JsonProperty.
💡 Старое имя можно оставить для десериализации через @JsonAlias.
💡 @JsonAlias влияет на чтение JSON, но не меняет имя поля при сериализации.

Решение
public class BookDto {

    @JsonProperty("name")
    @JsonAlias("title")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Теперь оба входных варианта будут корректно десериализованы:

{
  "name": "Clean Code"
}

и:

{
  "title": "Clean Code"
}

В обоих случаях значение попадёт в поле:

private String name;

При сериализации объекта наружу Jackson будет использовать новое имя:

{
  "name": "Clean Code"
}

Таким образом, @JsonProperty("name") задаёт актуальное имя поля, а @JsonAlias("title") позволяет временно поддерживать старый контракт API.