Jackson - JsonMappingException (Az osztályhoz nem található sorosító)

1. Áttekintés

Ebben a gyors bemutatóban elemezni fogjuk az entitások rendezését getterek nélkül és a megoldás a Jackson számára JsonMappingException kivétel.

Ha mélyebbre akarsz ásni és tanulni egyéb jó dolgokat tehetsz a Jackson 2-vel - folytassa a Jackson fő oktatóanyaggal.

2. A probléma

Alapértelmezés szerint a Jackson 2 csak olyan mezőkkel fog működni, amelyek nyilvánosak, vagy nyilvános módszerekkel rendelkeznek - Az entitás sorosítása, amelynek minden mezője privát vagy csomag privát, meghiúsul:

public class MyDtoNoAccessors {String stringValue; int intValue; boolean booleanValue; nyilvános MyDtoNoAccessors () {super (); } // nincs szerzés}
A @Test (várható = JsonMappingException.class) public void givenObjectHasNoAccessors_whenSerializing_thenException () dobja a JsonParseException, IOException {String dtoAsString = új ObjectMapper (). WriteValueAsString (új) assertThat (dtoAsString, notNullValue ()); }

A teljes kivétel az:

com.fasterxml.jackson.databind.JsonMappingException: Nem található sorosító a dtos osztályhoz. MyDtoNoAccessors és nem találtak tulajdonságokat a BeanSerializer létrehozásához (a kivétel elkerülése érdekében tiltsa le a SerializationFeature.FAIL_ON_EMPTY_BEANS)

3. A megoldás

A kézenfekvő megoldás az, hogy gettert adunk a mezőkhöz - ha az entitás az irányításunk alatt áll. Ha nem ez a helyzet, és az entitás forrásának módosítása nem lehetséges - akkor Jackson nyújt számunkra néhány alternatívát.

3.1. Bármely láthatósággal rendelkező mezők globális automatikus észlelése

Az első megoldás erre a problémára a ObjectMapper az összes mező észleléséhez, függetlenül azok láthatóságától:

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

Ez lesz lehetővé teszi a privát és a csomag privát mezők észlelését getterek nélkül, és a sorosítás megfelelően fog működni:

@Test public void givenObjectHasNoAccessors_whenSerializingWithAllFieldsDetected_thenNoException () dobja JsonParseException, IOException {ObjectMapper objectMapper = new ObjectMapper (); objectMapper.setVisibility (PropertyAccessor.FIELD, Visibility.ANY); Karakterlánc dtoAsString = objectMapper.writeValueAsString (új MyDtoNoAccessors ()); assertThat (dtoAsString, tartalmazString ("intValue")); assertThat (dtoAsString, tartalmazString ("stringValue")); assertThat (dtoAsString, tartalmazString ("booleanValue")); }

3.2. Osztály szintű összes mező észlelése

A Jackson 2 egy másik lehetősége - a globális konfiguráció helyett - osztályterületen ellenőrizni a terepi láthatóságot a @JsonAutoDetect kommentár:

@JsonAutoDetect (fieldVisibility = Visibility.ANY) nyilvános osztály MyDtoNoAccessors {...}

Ezzel a megjegyzéssel a sorosításnak megfelelően kell működnie ezzel az adott osztállyal:

@Test public void givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException () dobja JsonParseException, IOException {ObjectMapper objectMapper = new ObjectMapper (); Karakterlánc dtoAsString = objectMapper.writeValueAsString (új MyDtoNoAccessors ()); assertThat (dtoAsString, tartalmazString ("intValue")); assertThat (dtoAsString, tartalmazString ("stringValue")); assertThat (dtoAsString, tartalmazString ("booleanValue")); }

4. Következtetés

Ez a cikk bemutatta, hogyan kell megkerülni az alapértelmezett mezőlátást Jacksonban, egyéni láthatóság konfigurálásával globálisan a ObjectMapper vagy az egyes osztályokon. Jackson még további testreszabást tesz lehetővé azáltal, hogy lehetőséget nyújt arra, hogy pontosan szabályozza, hogy a térképező hogyan látja a gettereket, a beállítókat vagy a meghatározott láthatóságú mezőket.

Mindezen példák és kódrészletek megvalósítása megtalálható a GitHub projektemben - ez egy Eclipse-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.