ג'קסון - JsonMappingException (לא נמצא סידור עבור הכיתה)

1. סקירה כללית

במדריך מהיר זה ננתח את התערבות הגופים ללא גטרים ו הפיתרון לג'קסון JsonMappingException יוצא מן הכלל.

אם אתה רוצה להעמיק וללמוד דברים מגניבים אחרים שאתה יכול לעשות עם ג'קסון 2 - המשך למדריכה הראשית של ג'קסון.

2. הבעיה

כברירת מחדל, ג'קסון 2 יעבוד רק עם שדות שהם ציבוריים או שיש להם שיטות גטריות ציבוריות - סדרת יישות שיש לה את כל השדות פרטיים או חבילה פרטית תיכשל:

מחלקה ציבורית MyDtoNoAccessors {String stringValue; int intalue; ערך בוליאני בוליאני; MyDtoNoAccessors ציבורי () {super (); } // אין גטרים}
@Test (צפוי = JsonMappingException.class) חלל ציבורי givenObjectHasNoAccessors_whenSerializing_thenException () זורק JsonParseException, IOException {String dtoAsString = ObjectMapper חדש (). WriteValueAsString (חדש MyDtoNoAccess; assertThat (dtoAsString, notNullValue ()); }

ה חריג מלא הוא:

com.fasterxml.jackson.databind.JsonMappingException: לא נמצא סידור עבור כיתות dtos.MyDtoNoAccessors ולא התגלו מאפיינים ליצירת BeanSerializer (כדי להימנע מחריג, השבת את SerializationFeature.FAIL_ON_EMPTY_BEANS))

3. הפיתרון

הפיתרון הברור הוא להוסיף גטררים לשדות - אם הישות בשליטתנו. אם זה לא המקרה ו שינוי מקור הישות אינו אפשרי - אז ג'קסון מספק לנו כמה חלופות.

3.1. גלוי אוטומטי שדות בכל נראות

פיתרון ראשון לבעיה זו הוא הגדרת התצורה הגלובלית ObjectMapper לאיתור כל השדות, ללא קשר לנראות שלהם:

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

זה יהיה לאפשר זיהוי של השדות הפרטיים והחבילה ללא getters, וסידור יעבוד כראוי:

@Test הציבור בטל givenObjectHasNoAccessors_whenSerializingWithAllFieldsDetected_thenNoException () זורק JsonParseException, IOException {ObjectMapper objectMapper = חדש ObjectMapper (); objectMapper.setVisibility (PropertyAccessor.FIELD, Visibility.ANY); מחרוזת dtoAsString = objectMapper.writeValueAsString (MyDtoNoAccessors חדשים ()); assertThat (dtoAsString, containString ("intValue")); assertThat (dtoAsString, containString ("stringValue")); assertThat (dtoAsString, containString ("booleanValue")); }

3.2. זוהה כל השדות ברמת הכיתה

אפשרות נוספת שג'קסון 2 מספק היא - במקום התצורה הגלובלית - לשלוט על נראות השדה ברמת הכיתה דרך ה- @JsonAutoDetect ביאור:

@JsonAutoDetect (fieldVisibility = Visibility.ANY) מחלקה ציבורית MyDtoNoAccessors {...}

עם הערה זו, הסידור צריך לעבוד כעת כהלכה עם מחלקה מסוימת זו:

@Test ציבורי בטל givenObjectHasNoAccessorsButHasVisibleFields_whenSerializing_thenNoException () זורק JsonParseException, IOException {ObjectMapper objectMapper = חדש ObjectMapper (); מחרוזת dtoAsString = objectMapper.writeValueAsString (MyDtoNoAccessors חדשים ()); assertThat (dtoAsString, containString ("intValue")); assertThat (dtoAsString, containString ("stringValue")); assertThat (dtoAsString, containString ("booleanValue")); }

4. מסקנה

מאמר זה המחיש כיצד לעקוף את נראות השדה המוגדרת כברירת מחדל בג'קסון, על ידי הגדרת תצוגה מותאמת אישית או ברחבי העולם ObjectMapper או על שיעורים בודדים. ג'קסון מאפשר התאמה אישית נוספת עוד יותר על ידי מתן אפשרויות לשלוט במדויק כיצד רואים המתמחים, מגדירים או שדות בעלי נראות ספציפית.

יישום כל הדוגמאות וקטעי הקוד ניתן למצוא בפרויקט GitHub שלי - זהו פרויקט מבוסס ליקוי חמה, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.


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