Jackson - JsonMappingException (pre triedu sa nenašiel žiadny serializátor)

1. Prehľad

V tomto rýchlom výučbe budeme analyzovať zoradenie entít bez kariet a riešenie pre Jacksona JsonMappingException výnimkou.

Ak chcete kopať hlbšie a učiť sa ďalšie super veci, ktoré môžete s Jacksonom 2 robiť - pokračujte ďalej k hlavnému výukovému programu Jackson.

2. Problém

V predvolenom nastavení bude Jackson 2 fungovať iba s poliami, ktoré sú buď verejné, alebo majú metódy verejného getra - serializácia entity, ktorá má všetky polia súkromné ​​alebo súkromné, zlyhá:

verejná trieda MyDtoNoAccessors {String stringValue; int intValue; boolean booleanValue; public MyDtoNoAccessors () {super (); } // žiaden getter}
@Test (očakáva sa = JsonMappingException.class) public void givenObjectHasNoAccessors_whenSerializing_thenException () hodí JsonParseException, IOException {String dtoAsString = new ObjectMapper (). WriteValueAsString (new MyDtoNoAccessors assertThat (dtoAsString, notNullValue ()); }

The úplná výnimka je:

com.fasterxml.jackson.databind.JsonMappingException: Nenašiel sa žiadny serializátor pre triedu dtos.MyDtoNoAccessors a nezistili sa žiadne vlastnosti na vytvorenie BeanSerializer (aby ste sa vyhli výnimkám, deaktivujte SerializationFeature.FAIL_ON_EMPTY_BEANS)

3. Riešenie

Zjavným riešením je pridať getre pre polia - ak je entita pod našou kontrolou. Ak to tak nie je a úprava zdroja entity nie je možná - potom nám Jackson poskytuje niekoľko alternatív.

3.1. Globálne automaticky detekujte polia za akejkoľvek viditeľnosti

Prvým riešením tohto problému je globálna konfigurácia servera ObjectMapper na detekciu všetkých polí bez ohľadu na ich viditeľnosť:

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

Toto bude umožniť detekciu súkromných a balíkových súkromných polí bez getrov a serializácia bude fungovať správne:

@ Test public void givenObjectHasNoAccessors_whenSerializingWithAllFieldsDetected_thenNoException () hodí JsonParseException, IOException {ObjectMapper objectMapper = nový ObjectMapper (); objectMapper.setVisibility (PropertyAccessor.FIELD, Visibility.ANY); Reťazec dtoAsString = objectMapper.writeValueAsString (nový MyDtoNoAccessors ()); assertThat (dtoAsString, containsString ("intValue")); assertThat (dtoAsString, containsString ("stringValue")); assertThat (dtoAsString, containsString ("booleanValue")); }

3.2. Zistili sa všetky polia na úrovni triedy

Ďalšou možnosťou, ktorú Jackson 2 poskytuje, je - namiesto globálnej konfigurácie - riadiť viditeľnosť poľa na úrovni triedy cez @JsonAutoDetect anotácia:

@JsonAutoDetect (fieldVisibility = Visibility.ANY) verejná trieda MyDtoNoAccessors {...}

S touto anotáciou by teraz mala serializácia správne fungovať s touto konkrétnou triedou:

@Test public void givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException () vyvolá JsonParseException, IOException {ObjectMapper objectMapper = nový ObjectMapper (); Reťazec dtoAsString = objectMapper.writeValueAsString (nový MyDtoNoAccessors ()); assertThat (dtoAsString, containsString ("intValue")); assertThat (dtoAsString, containsString ("stringValue")); assertThat (dtoAsString, containsString ("booleanValue")); }

4. Záver

Tento článok ilustroval, ako na to obísť predvolenú viditeľnosť poľa v Jacksonnakonfigurovaním vlastnej viditeľnosti globálne na serveri ObjectMapper alebo na jednotlivých triedach. Jackson umožňuje ešte ďalšie prispôsobenie tým, že poskytuje možnosti na presné riadenie toho, ako mapovač vidí zakladateľov, zakladateľov alebo polia so špecifickými viditeľnosťami.

Implementácia všetkých týchto príkladov a útržkov kódu nájdete v mojom projekte GitHub - toto je projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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