בקרי ממשק מונחים באביב

1. הקדמה

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

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

בדרך כלל, כאשר אנו מגדירים בקר ב- Spring MVC, אנו מקשטים את שיטותיו בהערות שונות המציינות את הבקשה: כתובת ה- URL של נקודת הקצה, שיטת בקשת HTTP, משתני הנתיב וכן הלאה.

אנחנו יכולים, למשל, להציג את ה- / שמור / {id} נקודת קצה באמצעות ההערות האמורות בשיטה אחרת בדרך כלל:

@PostMapping ("/ save / {id}") @ResponseBody שמירת ספר ציבורי (@RequestBody Book Book, @PathVariable id id) {// יישום}

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

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

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

באביב 5.1, עם זאת, הציג תכונה חדשה:

הערות פרמטרים של בקר מתגלות גם בממשקים: מאפשרות חוזי מיפוי מלאים בממשקי בקר.

בואו נבדוק כיצד נוכל להשתמש בתכונה זו.

3. ממשק הבקר

3.1. הגדרת הקשר

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

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

3.2. מִמְשָׁק

בואו נגדיר ממשק Java רגיל בו אנו מגדירים לא רק את חתימות השיטות אלא גם את סוג בקשות האינטרנט בהן הם אמורים לטפל:

@RequestMapping ("/ ברירת מחדל") ממשק ציבורי BookOperations {@ GetMapping ("/") רשימת getAll (); @GetMapping ("/ {id}") getById (@ ID PathVariable int) אופציונלי; @PostMapping ("/ save / {id}") שמירה בטלנית ציבורית (ספר ספר @RequestBody, @PathVariable מזהה); }

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

@RestController @RequestMapping ("/ book") מחלקה ציבורית BookController מיישמת את BookOperations {@Override public List getAll () {...} @Override public אופציונלי getById (id מזהה) {...} @Override שמירה בטלה ציבורית (ספר ספרים , מזהה int) {...}}

עלינו להוסיף את ההערה ברמת הכיתה @ RestController אוֹ @בקר לבקר שלנו. מוגדר בצורה זו, הבקר יורש את כל ההערות הקשורות למיפוי בקשות האינטרנט.

על מנת לבדוק שהבקר פועל כעת כצפוי, בוא נפעיל את היישום ונלחץ על קבל הכל() שיטה על ידי הגשת הבקשה המתאימה:

תלתל // localhost: 8081 / ספר /

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

@RequestMapping ("/ book") BookController בכיתה ציבורית מיישם את BookOperations {...}

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

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

3.3. הערה זהירות

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

נגרם על ידי: java.lang.IllegalStateException: מיפוי דו משמעי.

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

4. מסקנה

במדריך זה שקלנו תכונה חדשה שהוצגה באביב 5.1. כעת, כאשר בקרי Spring MVC מיישמים ממשק, הם עושים זאת לא רק בדרך Java הרגילה אלא גם יורשים את כל הפונקציונליות הקשורה לבקשת האינטרנט המוגדרת בממשק.

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


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