Krótko mówiąc, jeden z moich obiektów ma GeometryCollection, który zgłasza wyjątek, gdy wywołujesz „getBoundary” (powodem tego jest kolejna książka, na razie powiedzmy, że tak to działa).
Czy jest sposób, w jaki mogę powiedzieć Jacksonowi, aby nie uwzględniał tego konkretnego pobieracza? Wiem, że mogę używać @JacksonIgnore, gdy posiadam / kontroluję kod. Ale tak nie jest, jackson kończy się osiągając ten punkt poprzez ciągłą serializację obiektów nadrzędnych. Widziałem opcję filtrowania w dokumentacji Jacksona. Czy to wiarygodne rozwiązanie?
Dzięki!
objectMapper.addMixInAnnotations(Class<?> target, Class<?> mixinSource);
Inną możliwością jest to, że jeśli chcesz zignorować wszystkie nieznane właściwości, możesz skonfigurować program odwzorowujący w następujący sposób:
źródło
mapper.configure(DeserializationFeature.failOnUnknownPropertiesExcep(new String[] {"myField"}));
without()
:mapper.reader().without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
Korzystanie z klasy Java
Korzystanie z adnotacji
źródło
Podejście oparte na adnotacjach jest lepsze. Ale czasami potrzebna jest obsługa ręczna. W tym celu możesz użyć bez metody ObjectWriter .
źródło
Dodane adnotacje działają tutaj całkiem dobrze, jak już wspomniano. Inną możliwością wykraczającą poza właściwość @JsonIgnore jest użycie @JsonIgnoreType, jeśli masz typ, który nigdy nie powinien być uwzględniany (tj. Jeśli wszystkie wystąpienia właściwości GeometryCollection powinny być ignorowane). Możesz wtedy dodać go bezpośrednio (jeśli kontrolujesz typ) lub użyć miksu, na przykład:
Może to być wygodniejsze, jeśli masz wiele klas, z których wszystkie mają jeden akcesor „IgnoredType getContext ()” lub coś podobnego (co ma miejsce w przypadku wielu frameworków)
źródło
Miałem podobny problem, ale był on związany z dwukierunkowymi relacjami Hibernate. Chciałem pokazać jedną stronę relacji, a programowo zignorować drugą, w zależności od tego, z jakim poglądem mam do czynienia. Jeśli nie możesz tego zrobić, skończysz z paskudnym
StackOverflowException
s. Na przykład, gdybym miał te obiektyChciałbym programowo zignorować
parent
pole w B, gdybym patrzył na A, i zignorowaćchildren
pole w A, gdybym patrzył na B.Zacząłem używać do tego mixinów, ale to bardzo szybko staje się okropne; masz tak wiele bezużytecznych klas, które istnieją wyłącznie po to, by formatować dane. Skończyło się na napisaniu własnego serializatora, aby poradzić sobie z tym w bardziej przejrzysty sposób: https://github.com/monitorjbl/json-view .
Pozwala programowo określić, które pola mają być ignorowane:
Umożliwia także łatwe określanie bardzo uproszczonych widoków za pomocą dopasowywania symboli wieloznacznych:
W moim pierwotnym przypadku potrzeba prostych poglądów, takich jak ten, polegała na pokazaniu absolutnego minimum na temat rodzica / dziecka, ale stało się również przydatne dla naszego bezpieczeństwa opartego na rolach. Mniej uprzywilejowane widoki obiektów wymagały zwrócenia mniejszej ilości informacji o obiekcie.
Wszystko to pochodzi z serializatora, ale w mojej aplikacji używałem Spring MVC. Aby poprawnie obsłużyć te przypadki, napisałem integrację, którą możesz dodać do istniejących klas kontrolerów Spring:
Oba są dostępne w Maven Central. Mam nadzieję, że pomoże to komuś innemu, jest to szczególnie brzydki problem z Jacksonem, który nie miał dobrego rozwiązania dla mojej sprawy.
źródło
Match.match()
?Jeśli chcesz ZAWSZE wykluczyć niektóre właściwości dla dowolnej klasy, możesz użyć
setMixInResolver
metody:źródło
Jeszcze jeden dobry punkt to użycie
@JsonFilter
. Niektóre szczegóły tutaj http://wiki.fasterxml.com/JacksonFeatureJsonFilterźródło