У меня есть класс сущности с полем пароля:
class User {
private String password;
//setter, getter..
}
Я хочу, чтобы это поле было пропущено во время сериализации. Но он все еще должен быть в состоянии DEserialize. Это необходимо, чтобы клиент мог отправить мне новый пароль, но не смог прочитать текущий.
Как мне сделать это с Джексоном?
@JsonIgnore
на getter, но@JsonProperty
на setter, в этом случае вещи не сериализуются, но могут быть десериализованы.Ответы:
Вы можете пометить это как
@JsonIgnore
.С 1.9 вы можете добавить
@JsonIgnore
для getter,@JsonProperty
для setter, чтобы десериализовать, но не сериализовать.источник
@JsonIgnore
для getter,@JsonProperty
для setter, чтобы десериализовать, но не сериализовать.transient
(как вprivate transient String password;
), но переходные поля с общедоступными получателями игнорируются, если не включен MapperFeature.PROPAGATE_TRANSIENT_MARKER .Иллюстрируя сказанное StaxMan, это работает для меня
источник
@JsonIgnore
не нужно на поле, кажется.Самый простой способ - комментировать ваши методы получения и установки.
Вот оригинальный пример, измененный, чтобы исключить простой текстовый пароль, но затем аннотировать новый метод, который просто возвращает поле пароля в виде зашифрованного текста.
источник
Начиная с Jackson 2.6 , свойство может быть помечено как доступное только для чтения или записи. Это проще, чем взломать аннотации на обоих средствах доступа и хранить всю информацию в одном месте:
источник
Кроме того
@JsonIgnore
, есть несколько других возможностей:@JsonIgnoreProperties
на уроке может быть полезноисточник
transient
это решение для меня. Спасибо! он является родным для Java и не требует добавления другой аннотации, специфичной для фреймворка.источник
Следует спросить, зачем вам нужен публичный метод получения пароля. Hibernate, или любая другая платформа ORM, будет делать с частным методом получения. Для проверки правильности пароля вы можете использовать
источник
У Джексона есть класс SimpleBeanPropertyFilter, который помогает фильтровать поля во время сериализации и десериализации; не глобально. Я думаю, это то, что вы хотели.
Тогда в вашем коде:
Это предотвратит
password
сериализацию поля. Также вы сможете десериализоватьpassword
поля как есть. Просто убедитесь, что фильтры не применяются к объекту ObjectMapper.источник
установить переменную как
@JsonIgnore
Это позволяет переменной быть пропущенным сериализатором json
источник