@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;
}
Кто-нибудь использовал эту же аннотацию как для поля, так и для геттеров/сеттеров? Я огляделся по сети, но ничего не увидел.
Я скомпилировал и запустил код, но я не уверен, что это вызовет проблемы в будущем. Любые мысли об этом?
Ответы
Ответ 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" (сериализация с использованием одного имени, десериализация с использованием другого): это иногда полезно для своего рода переименования.