Подтвердить что ты не робот

@JsonProperty аннотация на поле, а также геттер/сеттер

Я унаследовал определенный бит-код, который имеет аннотацию @JsonProperty на getter/setters. Целью является то, что, когда объект сериализуется с использованием библиотеки Джексона, поля имеют это конкретное имя.

Текущий код:

private String fileName;

@JsonProperty("FILENAME")
public String getFileName()
{
    return fileName;
}

@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

Теперь для другого инструмента мне нужно также аннотировать поле с помощью JsonProperty. Итак, это будет мой измененный код:

@JsonProperty("FILENAME")
private String fileName;

@JsonProperty("FILENAME")
public String getFileName()
{
    return fileName;
}

@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

Кто-нибудь использовал эту же аннотацию как для поля, так и для геттеров/сеттеров? Я огляделся по сети, но ничего не увидел.

Я скомпилировал и запустил код, но я не уверен, что это вызовет проблемы в будущем. Любые мысли об этом?

4b9b3361

Ответ 1

Мои наблюдения, основанные на нескольких тестах, заключались в том, что любое имя отличается от имени свойства, которое вступает в силу:

Например, рассмотрите небольшую модификацию вашего дела:

@JsonProperty("fileName")
private String fileName;

@JsonProperty("fileName")
public String getFileName()
{
    return fileName;
}

@JsonProperty("fileName1")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

Оба поля fileName и метод getFileName имеют правильное имя свойства fileName, а setFileName - другое fileName1, в этом случае Джексон будет искать атрибут fileName1 в json в точке десериализации и создаст атрибут fileName1 в точке сериализации.

Теперь, придя к вашему делу, где все три @JsonProperty отличаются от имени свойства по умолчанию fileName, он просто выбрал бы один из них как атрибут (fileName), и любой из трех отличался, это вызвало бы исключение:

java.lang.IllegalStateException: Conflicting property name definitions

Ответ 2

В дополнение к существующим хорошим ответам обратите внимание на то, что улучшенная обработка Jackson 1.9, добавив "унификация свойств", что означает, что ВСЕ аннотации из разностных частей логического свойства объединяются, используя (надеюсь) интуитивное преимущество.

В Jackson 1.8 и ранее использовались только аннотации полей и геттеров при определении того, что и как сериализовать (записывая JSON); и только и аннотации setter для десериализации (чтение JSON). Это иногда требовало добавления "дополнительных" аннотаций, таких как аннотирование как getter, так и setter.

С Jackson 1.9 и выше эти дополнительные аннотации НЕ нужны. Их можно добавить; и если используются разные имена, можно создавать свойства "split" (сериализация с использованием одного имени, десериализация с использованием другого): это иногда полезно для своего рода переименования.