Mam obiekt użytkownika, który jest wysyłany do i z serwera. Kiedy wysyłam obiekt użytkownika, nie chcę wysyłać zaszyfrowanego hasła do klienta. Dodałem @JsonIgnore
więc właściwość hasła, ale to również blokuje możliwość przekształcenia go w hasło, które utrudnia rejestrację użytkowników, którzy nie mają hasła.
Jak mogę @JsonIgnore
zastosować tylko do serializacji, a nie deserializacji? Korzystam z Spring JSONView, więc nie mam żadnej kontroli nad ObjectMapper
.
Rzeczy, których próbowałem:
- Dodaj
@JsonIgnore
do nieruchomości - Dodaj
@JsonIgnore
tylko metodę gettera
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
Aby to osiągnąć, potrzebujemy tylko dwóch adnotacji:
@JsonIgnore
@JsonProperty
Użyj
@JsonIgnore
na członku klasy i jego narzędziu pobierającym oraz@JsonProperty
na jego ustawniku. Pomoże w tym przykładowa ilustracja:źródło
Od wersji 2.6: bardziej intuicyjnym sposobem jest użycie
com.fasterxml.jackson.annotation.JsonProperty
adnotacji na polu:Nawet jeśli istnieje moduł pobierający, wartość pola jest wykluczana z serializacji.
JavaDoc mówi:
Jeśli potrzebujesz go na odwrót, po prostu użyj
Access.READ_ONLY
.źródło
W moim przypadku Jackson automatycznie (od) serializuje obiekty, które zwracam ze sterownika Spring MVC (używam @RestController ze Spring 4.1.6). Musiałem użyć
com.fasterxml.jackson.annotation.JsonIgnore
zamiastorg.codehaus.jackson.annotate.JsonIgnore
, bo inaczej po prostu nic nie zrobiłem.źródło
źródło
Innym łatwym sposobem na poradzenie sobie z tym jest użycie argumentu
allowSetters=true
w adnotacji. Umożliwi to przekształcenie hasła do postaci szeregowej w dto, ale nie przekształci go w postać odpowiedzi, która używa obiektu.przykład:
Zarówno
foo
ibar
są wypełniane w obiekcie, ale tylko foo jest napisane w organizmie reakcji.źródło