jackson: как предотвратить сериализацию поля

У меня есть class сущности с полем пароля:

class User { private String password; //setter, getter.. } 

Я хочу, чтобы это поле было пропущено во время сериализации. Но он все равно должен был бы DEserialize. Это необходимо, чтобы клиент мог отправить мне новый пароль, но не смог прочитать текущий.

Как это сделать с jacksonом?

Вы можете отметить это как @JsonIgnore .

С 1.9 вы можете добавить @JsonIgnore для getter, @JsonProperty для setter, чтобы сделать его десериализованным, но не сериализованным.

Иллюстрируя, что сказал StaxMan, это работает для меня

 private String password; @JsonIgnore public String getPassword() { return password; } @JsonProperty public void setPassword(String password) { this.password = password; } 

Легкий способ – аннотировать ваши геттеры и сеттеры.

Вот оригинальный пример, измененный для исключения пароля обычного текста, но затем аннотируйте новый метод, который просто возвращает поле пароля в виде зашифрованного текста.

 class User { private String password; public void setPassword(String password){...} @JsonIgnore public String getPassword(){...} @JsonProperty("password"} public String getEncryptedPassword(){...} } 

Помимо @JsonIgnore , есть еще пара возможностей:

  • Использовать JSON Views для фильтрации полей условно (по умолчанию, не используется для десериализации, в 2.0 будет доступно, но вы можете использовать другое представление для сериализации, десериализации)
  • @JsonIgnoreProperties по classу может быть полезным

transient решение для меня. благодаря! он является родным для Java и позволяет вам добавить еще одну аннотацию для конкретной структуры.

Начиная с Jackson 2.6 , свойство может быть помечено как чтение или запись. Это проще, чем взломать annotations на обоих устройствах доступа и хранить всю информацию в одном месте:

 public class User { @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String password; } 

Нужно спросить, почему вам нужен публичный метод получения пароля. Спящий режим или любая другая структура ORM будет работать с частным методом получения. Для проверки правильности пароля вы можете использовать

 public boolean checkPassword(String password){ return this.password.equals(anyHashingMethod(password)); } 

У Jackson есть class с именем SimpleBeanPropertyFilter, который помогает фильтровать поля во время сериализации и десериализации; не глобально. Я думаю, это то, что вы хотели.

 @JsonFilter("custom_serializer") class User { private String password; //setter, getter.. } 

Затем в вашем коде:

 String[] fieldsToSkip = new String[] { "password" }; ObjectMapper mapper = new ObjectMapper(); final SimpleFilterProvider filter = new SimpleFilterProvider(); filter.addFilter("custom_serializer", SimpleBeanPropertyFilter.serializeAllExcept(fieldsToSkip)); mapper.setFilters(filter); String jsonStr = mapper.writeValueAsString(currentUser); 

Это предотвратит сериализацию поля password . Также вы сможете десериализовать поля password как есть. Просто убедитесь, что никакие фильтры не применяются к объекту ObjectMapper.

 ObjectMapper mapper = new ObjectMapper(); User user = mapper.readValue(yourJsonStr, User.class); // user object does have non-null password field 
  • Каков наилучший способ загрузить JSONObject из текстового файла json?
  • jqgrid json reader для результатов запроса сервера arcgis
  • Сериализация нескольких свойств DateTime в одном classе с использованием разных форматов для каждого из них
  • Как преобразовать данные списка в json в java
  • Java-реализация преобразования JSON в XML
  • Стандартный способ ссылки на объект по идентичности (например, для круговых ссылок)?
  • Обеспечение json-ключей в .NET
  • Объекты Java JSON GSON.fromJson
  • различия в приложении / json и application / x-www-form-urlencoded
  • Как конвертировать JSON в HashMap с помощью Gson?
  • Swift 4 Decodable с ключами, не известными до времени декодирования
  • Interesting Posts

    Нет расширения, способного загрузить конфигурацию для «facebookbundle» symfony2

    Синтаксическая ошибка в IE с использованием функций ES6 arrow

    jqgrid добавить строку и отправить данные в webservice для вставки

    Использует ли он меньше энергии для подключения к привязному телефону с помощью USB или Wi-Fi или Bluetooth?

    Получение контекста приложения Spring

    Как вы многоцелектируете библиотеку classов .NET Core с помощью csproj?

    В клон StackOverflow, какая связь должна иметь таблица комментариев в вопросах и ответах?

    Проверьте, содержит ли вектор данный элемент

    Есть ли способ получить версию из package.json в коде nodejs?

    Pyplot автоматически сортирует значения y

    Проблемы с доставкой ПК, если я перееду за границу?

    Несколько условий соединения с помощью оператора $ lookup

    Установление соединения SSH между машинами за брандмауэрами

    Откройте URL-адрес без использования браузера из пакетного файла

    Chrome изменил разрешение после сбоя

    Давайте будем гением компьютера.