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.