מיפוי בקשת האביב

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

במדריך זה נתמקד באחת ההערות העיקריות ב- אביב MVC: @ בקשת מיפוי.

במילים פשוטות, ההערה משמשת למיפוי בקשות אינטרנט לשיטות Spring Spring.

2. @בקשת מיפוי יסודות

נתחיל בדוגמה פשוטה: מיפוי בקשת HTTP לשיטה תוך שימוש בכמה קריטריונים בסיסיים.

2.1. @ בקשת מיפוי - בנתיב

@RequestMapping (value = "/ ex / foos", method = RequestMethod.GET) @ResponseBody public String getFoosBySimplePath () {return "Get some Foos"; }

כדי לבדוק את המיפוי הזה בפשטות סִלְסוּל פקודה, הפעל:

תלתל-אני // localhost: 8080 / מנוחה באביב / ex / foos

2.2. @ בקשת מיפוי - שיטת ה- HTTP

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

הנה דוגמה פשוטה, דומה לזו הקודמת, אך הפעם ממופה לבקשת HTTP POST:

@RequestMapping (value = "/ ex / foos", method = POST) @ResponseBody public מחרוזת postFoos () {חזרה "פרסם כמה Foos"; }

כדי לבדוק את ההודעה באמצעות א סִלְסוּל פקודה:

תלתל -אי -X פוסט // localhost: 8080 / אביב מנוחה / ex / foos

3. בקשת מיפוי וכותרות HTTP

3.1. @ בקשת מיפוי עם ה כותרות תְכוּנָה

ניתן לצמצם את המיפוי עוד יותר על ידי ציון כותרת לבקשה:

@RequestMapping (value = "/ ex / foos", headers = "key = val", method = GET) @ResponseBody public String getFoosWithHeader () {return "Get some Foos with Header"; }

כדי לבדוק את הפעולה, אנו נשתמש ב- סִלְסוּל כותרת תמיכה:

תלתל -i -H "key: val" // localhost: 8080 / spring-rest / ex / foos

ואפילו מספר כותרות באמצעות כותרות תכונה של @ בקשת מיפוי:

@RequestMapping (value = "/ ex / foos", headers = {"key1 = val1", "key2 = val2"}, method = GET) @ResponseBody Public String getFoosWithHeaders () {return "קבל כמה foos עם כותרת"; }

אנו יכולים לבדוק זאת באמצעות הפקודה:

תלתל -i -H "key1: val1" -H "key2: val2" // localhost: 8080 / spring-rest / ex / foos

שים לב כי עבור סִלְסוּל תחביר, נקודתיים מפרידה בין מפתח הכותרת לערך הכותרת, זהה למפרט ה- HTTP, ואילו באביב משתמשים בסימן השווה.

3.2. @ בקשת מיפוי צורכת ומפיקה

מיפוי סוגי מדיה המיוצרים על ידי בקר שווה תשומת לב מיוחדת.

אנו יכולים למפות בקשה על סמך הבקשה שלה לְקַבֵּל כותרת דרך @ בקשת מיפויכותרות תכונה שהוצגה לעיל:

@RequestMapping (value = "/ ex / foos", method = GET, headers = "Accept = application / json") @ResponseBody public String getFoosAsJsonFromBrowser () {return "Get some Foos with Header Old"; }

ההתאמה לדרך זו של הגדרת ה- לְקַבֵּל הכותרת היא גמישה - היא משתמשת בכיל במקום שווה, כך שבקשה כגון הבאה עדיין תמפה כהלכה:

תלתל -H "קבל: יישום / json, טקסט / html" // localhost: 8080 / spring-rest / ex / foos

החל באביב 3.1, @ בקשת מיפוי ביאור עכשיו יש את מייצר ו צורכת תכונות, במיוחד למטרה זו:

@RequestMapping (value = "/ ex / foos", method = RequestMethod.GET, produce = "application / json") @ResponseBody public String getFoosAsJsonFromREST () {return "Get some Foos with Header New"; }

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

זה נצרך באמצעות סִלְסוּל באותה הדרך:

תלתל -H "קבל: יישום / json" // localhost: 8080 / קפיץ-מנוחה / ex / foos

בנוסף, מייצר תומך גם בערכים מרובים:

@RequestMapping (value = "/ ex / foos", method = GET, produce = {"application / json", "application / xml"})

זכור כי אלה - הדרכים הישנות והחדשות לציון לְקַבֵּל כותרת - הם בעצם אותה מיפוי, כך שאביב לא יאפשר להם ביחד.

הפעלת שתי השיטות הללו תביא ל:

נגרם על ידי: java.lang.IllegalStateException: נמצא מיפוי דו משמעי. לא ניתן למפות שיטת שעועית 'fooController' java.lang.String org.baeldung.spring.web.controller .FooController.getFoosAsJsonFromREST () ל- {[/ ex / foos], שיטות = [GET], params = [], כותרות = [ ], צורכת = [], מייצרת = [application / json], custom = []}: יש כבר שיטת שעועית 'fooController' java.lang.String org.baeldung.spring.web.controller .FooController.getFoosAsJsonFromBrowser () ממופה .

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

וכמובן, אם אתה רוצה להעמיק בבניית ממשק API של REST עם Spring, בדוק קורס REST עם אביב חדש.

4. בקשת מיפוי עם משתני נתיב

ניתן לקשור חלקים מ- URI המיפוי למשתנים באמצעות ה- @ PathVariable ביאור.

4.1. יחיד @ PathVariable

דוגמה פשוטה עם משתנה נתיב יחיד:

@RequestMapping (value = "/ ex / foos / {id}", method = GET) @ResponseBody מחרוזת ציבורית getFoosBySimplePathWithPathVariable (@PathVariable ("id") מזהה ארוך) {return "קבל Foo ספציפי עם / ex / foos / { id} ", method = GET) @ResponseBody מחרוזת ציבורית getFoosBySimplePathWithPathVariable (@PathVariable מחרוזת מזהה) {return" קבל Foo ספציפי עם 2-multiple-pathvariable ">4.2. מרובות @ PathVariable

URI מורכב יותר עשוי למפות מספר חלקים של ה- URI אל ערכים מרובים:

@RequestMapping (value = "/ ex / foos / {fooid} / bar / {barid}", method = GET) @ResponseBody public String getFoosBySimplePathWithPathVariables (@PathVariable long fooid, @PathVariable long barid) {return "קבל בר ספציפי עם מ- Foo עם 3-pathvariable-with-regex ">4.3. @ PathVariable עם רגקס

ניתן להשתמש בביטויים רגולריים גם בעת מיפוי ה- @ PathVariable.

לדוגמא, נגדיל את המיפוי רק לקבל ערכים מספריים עבור ה- תְעוּדַת זֶהוּת:

@RequestMapping (value = "/ ex / bars / {numericId: [\ d] +}", method = GET) @ResponseBody public String getBarsBySimplePathWithPathVariable (@PathVariable numericId long) {return "קבל סרגל ספציפי עם בקשת param-param">5. בקשת מיפוי עם פרמטרים של בקשה

@RequestMapping מאפשר קל מיפוי של פרמטרים של כתובת אתר עם @RequestParam ביאור.

כעת אנו ממפים בקשה ל- URI:

// localhost: 8080 / spring-rest / ex / bars? id = 100
@RequestMapping (value = "/ ex / bars", method = GET) @ResponseBody public String getBarBySimplePathWithRequestParam (@RequestParam ("id") id ארוך) {return "קבל סרגל ספציפי עם / ex / bars", params = "id ", method = GET) @ResponseBody String מחרוזת getBarBySimplePathWithExplicitRequestParam (@RequestParam (" id ") מזהה ארוך) {return" קבל בר ספציפי עם / ex / bars ", params = {" id "," second "}, method = GET) @ResponseBody String מחרוזת getBarBySimplePathWithExplicitRequestParams (@RequestParam ("id") מזהה ארוך) {return "Narrow קבל סרגל ספציפי עם מקרי קרן">6. בקשת מיפוי תיקים פינתיים

6.1. @ בקשת מיפוי - נתיבים מרובים הממופים לאותה שיטת בקר

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

במקרה הזה, ה ערך תכונה של @ בקשת מיפוי אכן מקבל מיפויים מרובים, לא רק אחד:

@RequestMapping (value = {"/ ex / advanced / bars", "/ ex / advanced / foos"}, method = GET) @ResponseBody public String getFoosOrBarsByPath () {return "Advanced - Get some Foos or Bars"; }

עכשיו שני אלה סִלְסוּל פקודות צריכות לפגוע באותה שיטה:

curl -i // localhost: 8080 / spring-rest / ex / advanced / foos curl -i // localhost: 8080 / spring-rest / ex / advanced / bars

6.2. @ בקשת מיפוי - מספר שיטות בקשת HTTP לאותה שיטת בקר

ניתן למפות בקשות מרובות המשתמשות בפעלים שונים של HTTP לאותה שיטת בקר:

@RequestMapping (value = "/ ex / foos / multiple", method = {RequestMethod.PUT, RequestMethod.POST}) @ResponseBody מחרוזת ציבורית putAndPostFoos () {להחזיר "Advanced - PUT ו- POST בשיטה אחת"; }

עם סִלְסוּל, שני אלה יגיעו כעת לאותה שיטה:

תלתל -אי -X פוסט // localhost: 8080 / קפיץ-מנוחה / ex / foos / מרובה תלתל -i -X ​​PUT // localhost: 8080 / spring-rest / ex / foos / multiple

6.3. @ בקשת מיפוי - חיסרון לכל הבקשות

כדי ליישם חיסרון פשוט לכל הבקשות בשיטת HTTP מסוימת, למשל עבור GET:

@RequestMapping (value = "*", method = RequestMethod.GET) @ResponseBody Public String getFallback () {return "Fallback for GET בקשות"; }

או אפילו לכל הבקשות:

@RequestMapping (value = "*", method = {RequestMethod.GET, RequestMethod.POST ...}) @ResponseBody public String allFallback () {return "Fallback for All Requests"; }

6.4. שגיאת מיפוי דו משמעית

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

לדוגמא, זו מיפוי דו משמעי:

@GetMapping (value = "foos / duplicate") שכפול מחרוזת ציבורי () {החזר "שכפול"; } @ GetMapping (value = "foos / duplicate") ציבורי מחרוזת duplicateEx () {להחזיר "שכפול"; }

החריג שנזרק כולל בדרך כלל הודעות שגיאה בשורות אלה:

נגרם על ידי: java.lang.IllegalStateException: מיפוי דו משמעי. לא ניתן למפות את שיטת 'fooMappingExamplesController' ציבורית java.lang.String org.baeldung.web.controller.FooMappingExamplesController.duplicateEx () ל- {[/ ex / foos / duplicate], שיטות = [GET]}: יש כבר שעועית 'fooMappingExamplesController' שיטה ציבורית java.lang.String org.baeldung.web.controller.FooMappingExamplesController.duplicate () ממופה.

קריאה מדוקדקת של הודעת השגיאה מצביעה על העובדה ש- Spring לא מצליח למפות את השיטה org.baeldung.web.controller.FooMappingExamplesController.duplicateEx (), מכיוון שיש בו מיפוי סותר עם מיפוי שכבר org.baeldung.web.controller.FooMappingExamplesController.duplicate ().

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

@GetMapping (value = "foos / duplicate", מייצר = MediaType.APPLICATION_XML_VALUE) ציבורי מחרוזת duplicateXml () {להחזיר "שכפול"; } @ GetMapping (value = "foos / duplicate", מייצר = MediaType.APPLICATION_JSON_VALUE) ציבורי מחרוזת duplicateJson () {return "{\" message \ ": \" Duplicate \ "}"; }

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

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

7. קיצורי דרך למיפוי בקשות חדשות

Spring Framework 4.3 הציגה כמה הערות מיפוי חדשות של HTTP, הכל מבוסס על @ בקשת מיפוי :

  • @GetMapping
  • @ פוסט מיפוי
  • @ PutMapping
  • @DeleteMapping
  • @ תיקון מיפוי

הערות חדשות אלה יכולות לשפר את הקריאות ולהפחית את מילוליות הקוד.

בואו נסתכל על ההערות החדשות הללו בפעולה על ידי יצירת ממשק API RESTful התומך בפעולות CRUD:

@GetMapping ("/ {id}") ResponseEntity ציבורי getBazz (@PathVariable מזהה מחרוזת) {להחזיר ResponseEntity חדש (Bazz חדש (id, "Bazz" + id), HttpStatus.OK); } @ PostMapping הציבורי ResponseEntity newBazz (@RequestParam ("שם") שם מחרוזת) {להחזיר ResponseEntity חדש (Bazz חדש ("5", שם), HttpStatus.OK); } @PutMapping ("/ {id}") תגובה ResponseEntity ציבוריתBB (@PathVariable מזהה מחרוזת, @RequestParam ("שם") שם מחרוזת) {להחזיר ResponseEntity חדש (Bazz חדש (id, שם), HttpStatus.OK); } @DeleteMapping ("/ {id}") ResponseEntity ציבורי deleteBazz (@PathVariable מזהה מחרוזת) {להחזיר ResponseEntity חדש (Bazz (id) חדש, HttpStatus.OK); }

צלילה עמוקה לאלה ניתן למצוא כאן.

8. תצורת אביב

תצורת ה- MVC של האביב היא פשוטה מספיק, בהתחשב בכך שלנו FooController מוגדר בחבילה הבאה:

חבילה org.baeldung.spring.web.controller; @Controller מחלקה ציבורית FooController {...}

אנחנו פשוט צריכים a @תְצוּרָה בכיתה כדי לאפשר את התמיכה המלאה ב- MVC ולהגדיר את סריקת מסלול הכיתה לבקר:

@Configuration @EnableWebMvc @ComponentScan ({"org.baeldung.spring.web.controller"}) MvcConfig בכיתה ציבורית {//}

9. מסקנה

מאמר זה התמקד ב @ בקשת מיפוי ביאור באביב, דנים במקרה שימוש פשוט, מיפוי כותרות HTTP, מחייב חלקים של ה- URI עם @ PathVariable, ועבודה עם פרמטרים של URI ו- @RequestParam ביאור.

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

הקוד המלא מהמאמר זמין באתר GitHub.