Джексон: как предотвратить полевую сериализацию - PullRequest
145 голосов
/ 02 февраля 2012

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

class User {
    private String password;

    //setter, getter..
}

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

Как мне добиться этого с Джексоном?

Ответы [ 9 ]

171 голосов
/ 02 февраля 2012

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

С помощью 1.9 вы можете добавить @JsonIgnore для получения, @JsonProperty для установки, чтобы десериализовать, но не сериализовать.

92 голосов
/ 03 октября 2012

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

private String password;

@JsonIgnore
public String getPassword() {
    return password;
}

@JsonProperty
public void setPassword(String password) {
    this.password = password;
}
34 голосов
/ 21 февраля 2013

Самый простой способ - комментировать ваши методы получения и установки.

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

class User {

    private String password;

    public void setPassword(String password) {
        this.password = password;
    }

    @JsonIgnore
    public String getPassword() {
        return password;
    }

    @JsonProperty("password")
    public String getEncryptedPassword() {
        // encryption logic
    }
}
16 голосов
/ 03 февраля 2012

Помимо @JsonIgnore, есть несколько других возможностей:

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

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

public class User {
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;
}
7 голосов
/ 13 февраля 2013

transient это решение для меня.Спасибо!он встроен в Java и не требует добавления другой аннотации, специфичной для платформы.

3 голосов
/ 25 ноября 2016

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

public boolean checkPassword(String password){
  return this.password.equals(anyHashingMethod(password));
}
2 голосов
/ 07 апреля 2018

Джексон имеет класс с именем 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
0 голосов
/ 02 ноября 2018

установить переменную как

@ JsonIgnore

Это позволяет переменной пропускать json serializer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...