Jackson - JsonMappingException (nije pronađen serilizator za klasu)

1. Pregled

U ovom brzom vodiču analizirat ćemo raspodjelu entiteta bez getera i rješenje za Jacksona JsonMappingException iznimka.

Ako želite dublje kopati i učiti druge cool stvari koje možete raditi s Jacksonom 2 - krenite prema glavnom Jacksonovom vodiču.

2. Problem

Prema zadanim postavkama, Jackson 2 će raditi samo s poljima koja su ili javna ili imaju javne metode dobivanja - serializiranje entiteta koji ima sva polja private ili private private neće uspjeti:

javna klasa MyDtoNoAccessors {String stringValue; int intValue; boolean booleanValue; javni MyDtoNoAccessors () {super (); } // bez getera}
@Test (očekuje se = JsonMappingException.class) javna praznina givenObjectHasNoAccessors_whenSerializing_thenException () baca JsonParseException, IOException {String dtoAsString = new ObjectMapper (). WriteValueAsString (new) assertThat (dtoAsString, notNullValue ()); }

The puna iznimka je:

com.fasterxml.jackson.databind.JsonMappingException: Nije pronađen serializator za klasu dtos.MyDtoNoAccessors i nisu otkrivena svojstva za stvaranje BeanSerializer-a (da biste izbjegli iznimku, onemogućite SerializationFeature.FAIL_ON_EMPTY_BEANS)

3. Rješenje

Očito je rješenje dodati getere za polja - ako je entitet pod našom kontrolom. Ako to nije slučaj i izmjena izvora entiteta nije moguća - tada nam Jackson pruža nekoliko alternativa.

3.1. Globalno automatski otkrivaj polja uz bilo kakvu vidljivost

Prvo rješenje ovog problema je globalno konfiguriranje ObjectMapper za otkrivanje svih polja, bez obzira na njihovu vidljivost:

objectMapper.setVisibility (PropertyAccessor.FIELD, Visibility.ANY);

Ovo će dopustiti otkrivanje privatnih i privatnih polja bez getera, a serializacija će raditi ispravno:

@Test public void givenObjectHasNoAccessors_whenSerializingWithAllFieldsDetected_thenNoException () baca JsonParseException, IOException {ObjectMapper objectMapper = new ObjectMapper (); objectMapper.setVisibility (PropertyAccessor.FIELD, Visibility.ANY); Niz dtoAsString = objectMapper.writeValueAsString (novi MyDtoNoAccessors ()); assertThat (dtoAsString, containsString ("intValue")); assertThat (dtoAsString, containsString ("stringValue")); assertThat (dtoAsString, containsString ("booleanValue")); }

3.2. Otkrivena sva polja na razini predavanja

Druga opcija koju Jackson 2 pruža je - umjesto globalne konfiguracije - kontrolirati vidljivost na terenu na razini predavanja putem @JsonAutoDetect napomena:

@JsonAutoDetect (fieldVisibility = Visibility.ANY) javna klasa MyDtoNoAccessors {...}

Uz ovu napomenu, serializacija bi sada trebala ispravno raditi s ovom određenom klasom:

@Test public void givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException () baca JsonParseException, IOException {ObjectMapper objectMapper = new ObjectMapper (); Niz dtoAsString = objectMapper.writeValueAsString (novi MyDtoNoAccessors ()); assertThat (dtoAsString, containsString ("intValue")); assertThat (dtoAsString, containsString ("stringValue")); assertThat (dtoAsString, containsString ("booleanValue")); }

4. Zaključak

Ovaj je članak ilustrirao kako zaobiđite zadanu vidljivost polja u Jacksonu, konfiguriranjem prilagođene vidljivosti bilo globalno na ObjectMapper ili na pojedinačnim časovima. Jackson omogućuje još daljnje prilagođavanje pružajući mogućnosti za točno upravljanje načinom na koji mapteri vide getere, postavljače ili polja s određenim vidljivostima.

Implementacija svih ovih primjera i isječaka koda može se naći u mom GitHub projektu - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.


$config[zx-auto] not found$config[zx-overlay] not found