ה- HttpMediaTypeNotAcceptableException באביב MVC

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

במאמר מהיר זה, נסתכל על HttpMediaTypeNotAcceptableException חריג, ולהבין את המקרים שבהם אנו עלולים להיתקל בו.

2. הבעיה

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

ל- HTTP יש גם את הייעודי "לְקַבֵּל" כותרת - המשמשת לציין סוגי מדיה שהלקוח מזהה ויכול לקבל. במילים פשוטות, השרת ישלח חזרה ייצוג משאבים באמצעות אחד מסוגי המדיה שהלקוח ביקש.

עם זאת, אם אין סוג נפוץ ששני הצדדים יכולים לעבוד איתו, האביב יזרוק את HttpMediaTypeNotAcceptableException יוצא מן הכלל.

3. דוגמה מעשית

בואו ניצור דוגמה פשוטה שתדגים תרחיש זה.

אנו נשתמש בנקודת קצה של POST - שיכולה לעבוד רק איתה "יישום/ג'סון ומחזירה גם את נתוני JSON:

@PostMapping (value = "/ test", צורכת = MediaType.APPLICATION_JSON_VALUE, מייצר = MediaType.APPLICATION_JSON_VALUE) דוגמה למפה ציבורית () {להחזיר Collections.singletonMap ("מפתח", "ערך"); }

לאחר מכן, נשלח בקשה באמצעות CURL עם סוג תוכן שאינו מוכר:

curl -X POST - כותרת "קבל: יישום / pdf" // localhost: 8080 / test -v> POST / test HTTP / 1.1> מארח: localhost: 8080> User-Agent: curl / 7.51.0> קבל: יישום / pdf

התגובה שקיבלנו היא:

<HTTP / 1.1 406 <אורך תוכן: 0

4. הפיתרון

יש רק דרך אחת לפתור את הבעיה - לשלוח / לקבל אחד מהסוגים הנתמכים.

כל מה שאנחנו יכולים לעשות הוא לספק הודעה תיאורית יותר (כברירת מחדל אביב מחזיר גוף ריק) עם התאמה אישית ExceptionHandler להודיע ​​ללקוח על כל סוגי המדיה המקובלים.

במקרה שלנו זה רק "יישום / json":

@ResponseBody @ExceptionHandler (HttpMediaTypeNotAcceptableException.class) ידית מחרוזת ציבורית HttpMediaTypeNotAcceptableException () {return "סוג MIME מקובל:" + MediaType.APPLICATION_JSON_VALUE; }

5. מסקנה

במדריך זה שקלנו את HttpMediaTypeNotAcceptableException חריג שנזרק על ידי Spring MVC כאשר יש חוסר התאמה בין מה שהלקוח מבקש לבין מה שהשרת יכול לייצר בפועל.

כמו תמיד, קטעי הקוד המוזכרים במאמר נמצאים במאגר GitHub שלנו.


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