Jackson - JsonMappingException (ingen serializer fundet til klasse)

1. Oversigt

I denne hurtige vejledning analyserer vi marshalling af enheder uden getters og løsningen til Jackson JsonMappingException undtagelse.

Hvis du vil grave dybere og lære andre seje ting, du kan gøre med Jackson 2 - gå videre til den vigtigste Jackson-tutorial.

2. Problemet

Som standard fungerer Jackson 2 kun med felter, der enten er offentlige eller har en offentlig getter-metode - Serialisering af en enhed, der har alle felter private eller private pakke, mislykkes:

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

Det fuld undtagelse er:

com.fasterxml.jackson.databind.JsonMappingException: Ingen serializer fundet for klasse dtos.MyDtoNoAccessors og ingen egenskaber fundet for at oprette BeanSerializer (for at undgå undtagelse skal du deaktivere SerializationFeature.FAIL_ON_EMPTY_BEANS))

3. Løsningen

Den åbenlyse løsning er at tilføje getters til felterne - hvis enheden er under vores kontrol. Hvis det ikke er tilfældet, og ændring af enhedens kilde er ikke mulig - så giver Jackson os et par alternativer.

3.1. Globalt automatisk detektere felter med enhver synlighed

En første løsning på dette problem er at konfigurere globalt ObjectMapper at registrere alle felter, uanset deres synlighed:

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

Dette vil tillader, at de private felter og pakker private felter registreres uden getters, og serialisering fungerer korrekt:

@Test offentlig ugyldighed givenObjectHasNoAccessors_whenSerializingWithAllFieldsDetected_thenNoException () kaster JsonParseException, IOException {ObjectMapper objectMapper = ny ObjectMapper (); objectMapper.setVisibility (PropertyAccessor.FIELD, Visibility.ANY); String dtoAsString = objectMapper.writeValueAsString (nye MyDtoNoAccessors ()); assertThat (dtoAsString, containString ("intValue")); assertThat (dtoAsString, containString ("stringValue")); assertThat (dtoAsString, containString ("booleanValue")); }

3.2. Registreret alle felter på klasseniveau

En anden mulighed, Jackson 2 giver, er - i stedet for den globale konfiguration - kontrollere feltets synlighed på klasseniveau via @JsonAutoDetect kommentar:

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

Med denne kommentar skal serialiseringen nu fungere korrekt med denne klasse:

@Test offentlig ugyldighed givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException () kaster JsonParseException, IOException {ObjectMapper objectMapper = ny ObjectMapper (); String dtoAsString = objectMapper.writeValueAsString (nye MyDtoNoAccessors ()); assertThat (dtoAsString, indeholderString ("intValue")); assertThat (dtoAsString, containString ("stringValue")); assertThat (dtoAsString, containString ("booleanValue")); }

4. Konklusion

Denne artikel illustrerede, hvordan man gør det omgå standardfeltets synlighed i Jackson, ved at konfigurere en tilpasset synlighed enten globalt på ObjectMapper eller på individuelle klasser. Jackson tillader endnu yderligere tilpasning ved at give muligheder for at kontrollere nøjagtigt, hvordan kortlæggerne, setterne eller felterne med specifik synlighed ses.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i mit GitHub-projekt - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.