Jackson - JsonMappingException (ingen serielliser funnet for klassen)

1. Oversikt

I denne raske opplæringen vil vi analysere marshalling av enheter uten getters og løsningen for Jackson JsonMappingException unntak.

Hvis du vil grave dypere og lære andre kule ting du kan gjøre med Jackson 2 - gå videre til hovedveiledningen for Jackson.

2. Problemet

Som standard vil Jackson 2 bare arbeide med felt som enten er offentlige, eller som har offentlige getmetoder - Serialisering av en enhet som har alle felt private eller private pakker mislykkes:

offentlig klasse MyDtoNoAccessors {String stringValue; int intValue; boolsk boolsk verdi; offentlige MyDtoNoAccessors () {super (); } // ingen getters}
@Test (forventet = JsonMappingException.class) offentlig ugyldig gittObjectHasNoAccessors_whenSerializing_thenException () kaster JsonParseException, IOException {String dtoAsString = new ObjectMapper (). WriteValueAsString (new MyDtoNoAccess; assertThat (dtoAsString, notNullValue ()); }

De fullt unntak er:

com.fasterxml.jackson.databind.JsonMappingException: Ingen serializer funnet for klasse dtos.MyDtoNoAccessors og ingen egenskaper oppdaget for å lage BeanSerializer (for å unngå unntak, deaktiver SerializationFeature.FAIL_ON_EMPTY_BEANS))

3. Løsningen

Den åpenbare løsningen er å legge til getters for feltene - hvis enheten er under vår kontroll. Hvis det ikke er tilfelle og det er ikke mulig å endre kilden til enheten - så gir Jackson oss noen få alternativer.

3.1. Globalt oppdage felt automatisk med hvilken som helst synlighet

En første løsning på dette problemet er å konfigurere ObjectMapper for å oppdage alle felt, uavhengig av synlighet:

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

Dette vil tillate at private felt og pakker private felt blir oppdaget uten getters, og serialisering vil fungere riktig:

@Test offentlig tomrom gittObjectHasNoAccessors_whenSerializingWithAllFieldsDetected_thenNoException () kaster JsonParseException, IOException {ObjectMapper objectMapper = new ObjectMapper (); objectMapper.setVisibility (PropertyAccessor.FIELD, Visibility.ANY); Streng dtoAsString = objectMapper.writeValueAsString (nye MyDtoNoAccessors ()); assertThat (dtoAsString, containString ("intValue")); assertThat (dtoAsString, containString ("stringValue")); assertThat (dtoAsString, containString ("booleanValue")); }

3.2. Oppdaget alle felt på klassenivå

Et annet alternativ Jackson 2 gir er - i stedet for den globale konfigurasjonen - kontrollere feltsynligheten på klassenivå via @JsonAutoDetect kommentar:

@JsonAutoDetect (fieldVisibility = Visibility.ANY) offentlig klasse MyDtoNoAccessors {...}

Med denne kommentaren skal serialiseringen nå fungere riktig med denne klassen:

@Test offentlig ugyldighet gittObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException () kaster JsonParseException, IOException {ObjectMapper objectMapper = new ObjectMapper (); Streng dtoAsString = objectMapper.writeValueAsString (nye MyDtoNoAccessors ()); assertThat (dtoAsString, containString ("intValue")); assertThat (dtoAsString, containString ("stringValue")); assertThat (dtoAsString, containString ("booleanValue")); }

4. Konklusjon

Denne artikkelen illustrerte hvordan komme deg rundt standard feltsynlighet i Jackson, ved å konfigurere en tilpasset synlighet enten globalt på ObjectMapper eller på individuelle klasser. Jackson tillater enda videre tilpasning ved å tilby alternativer for å kontrollere nøyaktig hvordan getters, setters eller felt med spesifikk synlighet blir sett av kartleggeren.

Implementeringen av alle disse eksemplene og kodebiter kan du finne i GitHub-prosjektet mitt - dette er et formørkelsesbasert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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