תלות לא מרוצה באביב

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

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

2. הסיבה ל לא מרוצה תלות יוצא מן הכלל

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

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

3. יישום לדוגמא

נניח שיש לנו מחלקת שירות PurchaseDeptService, שתלוי ב מלאי מאגר:

המחלקה הציבורית @Service PurchaseDeptService {Public PurchaseDeptService (מאגר InventoryRepository) {this.repository = מאגר; }}
ממשק ציבורי InventoryRepository {} 
@Repository מחלקה ציבורית ShoeRepository מיישמת InventoryRepository {}
@ SpringBootApplication מחלקה ציבורית SpringDependenciesExampleApplication {public static void main (String [] args) {SpringApplication.run (SpringDependenciesExampleApplication.class, args); }} 

לעת עתה, נניח שכל השיעורים הללו ממוקמים באותה חבילה ששמה com.baeldung.dependency.exception.app.

כשאנחנו מריצים את היישום Spring Boot הזה, הכל עובד בסדר. בואו נראה איזה סוג של בעיות אנו יכולים להיתקל אם נדלג על שלב תצורה.

4. חסר הערת רכיב

עכשיו, בואו נסיר את מאגר @ ביאור מאתנו מאגר נעליים מעמד:

מחלקה ציבורית מיישמת ShoeRepository InventoryRepository {}

כשאנחנו מתחילים את היישום שלנו שוב, נראה את הודעת השגיאה הבאה: UnsatisfiedDependencyException: שגיאה ביצירת שעועית עם השם 'purchaseDeptService': תלות לא מרוצה מבוטאת באמצעות פרמטר בנאי 0

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

הוספת ה- מאגר @ ביאור חזרה אל ה- מאגר נעליים פותר את הבעיה.

5. החבילה לא נסרקה

בואו נעמיד את שלנו מאגר נעליים (ביחד עם InventoryRepository) לחבילה נפרדת בשם com.baeldung.dependency.exception.repository.

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

@SpringBootApplication @ComponentScan (basePackages = {"com.baeldung.dependency.exception"}) מחלקה ציבורית SpringDependenciesExampleApplication {public static void main (String [] args) {SpringApplication.run (SpringDependenciesExampleApplication.class, args); }} 

6. רזולוציית תלות לא ייחודית

נניח שנוסיף עוד אחד InventoryRepository יישום - DressRepository:

@Repository מחלקה ציבורית DressRepository מיישם InventoryRepository {} 

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

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

כדי לפתור זאת, ייתכן שנרצה להוסיף @מַגְדִיר להבחין בין המאגרים:

@Qualifier ("שמלות") @Repository בכיתה הציבורית DressRepository מיישמת InventoryRepository {} 
@Qualifier ("נעליים") @Repository מחלקה ציבורית ShoeRepository מיישמת InventoryRepository {}

כמו כן, נצטרך להוסיף מוסמך PurchaseDeptService תלות קונסטרוקטור:

Public PurchaseDeptService (@Qualifier ("שמלות") מאגר InventoryRepository) {this.repository = מאגר; }

זה יעשה DressRepository האפשרות היחידה הניתנת לביצוע, ואביב יזריק אותה PurchaseDeptService.

7. מסקנה

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

כדאי גם להסתכל במדריך הכללי יותר בנושא Spring BeanCreationException.

את הקוד המוצג כאן ניתן למצוא באתר GitHub.


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