Mam klasę encji z polem hasła:
class User {
private String password;
//setter, getter..
}
Chcę, aby to pole zostało pominięte podczas serializacji. Ale nadal powinien być w stanie DEserialize. Jest to potrzebne, aby klient mógł wysłać mi nowe hasło, ale nie może odczytać obecnego.
Jak mam to osiągnąć z Jacksonem?
@JsonIgnore
gettera, ale@JsonProperty
settera, w którym to przypadku rzeczy nie są serializowane, ale mogą być deserializowane.Odpowiedzi:
Możesz oznaczyć to jako
@JsonIgnore
.W wersji 1.9 możesz dodać
@JsonIgnore
dla getter,@JsonProperty
dla setter, aby deserializował, ale nie serializował.źródło
@JsonIgnore
dla getter,@JsonProperty
dla setter, aby deserializował, ale nie serializował.transient
(jak wprivate transient String password;
), ale przejściowe pola z publicznymi pobierającymi są ignorowane, chyba że MapperFeature.PROPAGATE_TRANSIENT_MARKER jest włączony.Ilustrując to, co powiedział StaxMan, działa to dla mnie
źródło
@JsonIgnore
wydaje się, że na boisku nie jest konieczne.Najłatwiejszym sposobem jest dodanie adnotacji do metod pobierających i ustawiających.
Oto oryginalny przykład zmodyfikowany w celu wykluczenia hasła w postaci zwykłego tekstu, ale następnie dodaj adnotację do nowej metody, która po prostu zwraca pole hasła jako zaszyfrowany tekst.
źródło
Począwszy od Jacksona 2.6 , właściwość może być oznaczona jako tylko do odczytu lub do zapisu. Jest to prostsze niż hakowanie adnotacji w obu akcesoriach i utrzymuje wszystkie informacje w jednym miejscu:
źródło
Oprócz tego
@JsonIgnore
istnieje kilka innych możliwości:@JsonIgnoreProperties
na zajęciach może być przydatneźródło
transient
jest rozwiązaniem dla mnie. dzięki! jest natywny dla języka Java i pozwala uniknąć dodawania kolejnej adnotacji specyficznej dla platformy.źródło
Należy zapytać, dlaczego chcesz mieć publiczną metodę pobierania hasła. Hibernate lub jakikolwiek inny framework ORM zrobi z prywatną metodą pobierającą. Aby sprawdzić, czy hasło jest poprawne, możesz użyć
źródło
Jackson ma klasę o nazwie SimpleBeanPropertyFilter, która pomaga filtrować pola podczas serializacji i deserializacji; nie globalnie. Myślę, że tego chciałeś.
Następnie w swoim kodzie:
Zapobiegnie
password
to serializacji pola. Będziesz także mógł deserializowaćpassword
pola w obecnej postaci. Upewnij się tylko, że na obiekcie ObjectMapper nie zastosowano żadnych filtrów.źródło
ustaw zmienną jako
@JsonIgnore
Dzięki temu zmienna może zostać pominięta przez serializator json
źródło