שעועית אביב יצירה יוצאת דופן

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

במאמר זה אנו דנים ב- אביב org.springframework.beans.factory.BeanCreationException - זה חריג נפוץ מאוד שנזרק כאשר BeanFactory יוצר שעועית של הגדרות השעועית ונתקל בבעיה. המאמר ידון בסיבות הנפוצות ביותר לחריג זה יחד עם הפתרון.

2. סיבה: org.springframework.beans.factory.NoSuchBeanDefinitionException

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

לדוגמה, BeanA מנסה להזריק BeanB:

@Component בכיתה ציבורית BeanA {@ תלות פרטית מאושרת ב- BeanB; ...}

אם BeanB לא נמצא בהקשר, ואז יושלך החריג הבא (שגיאת יצירת שעועית):

שגיאה ביצירת שעועית עם השם 'beanA': הזרקת תלות קווית אוטומטית נכשלה; יוצא מן הכלל המקונן הוא org.springframework.beans.factory.BeanCreationException: לא ניתן היה לבצע חוט אוטומטי בשדה: com com.baeldung.web.BeanB cpm.baeldung.web.BeanA.dependency; חריג מקונן הוא org.springframework.beans.factory.NoSuchBeanDefinitionException: שום שעועית מזכה מסוג [com.baeldung.web.BeanB] לא נמצאה לתלות: צפויה לפחות שעועית אחת שמתאימה למועמדת חוט אוטומטי לתלות זו. הערות תלות: {@ org.springframework.beans.factory.annotation.Autowired (חובה = נכון)}

כדי לאבחן סוג מסוג זה - ראשית, ודא שהשעועית מוכרזת:

  • או בקובץ תצורה של XML באמצעות ה- אֵלֵמֶנט
  • או בג'אווה @תְצוּרָה כיתה דרך @אפונה ביאור
  • או מסומן עם: @רְכִיב, מאגר @, @שֵׁרוּת, @בקר וסריקת מסלול הכיתה פעילה עבור אותה חבילה

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

3. סיבה: org.springframework.beans.factory.NoUniqueBeanDefinitionException

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

לדוגמה, BeanB1 ו BeanB2 שניהם מיישמים את אותו ממשק:

@Component בכיתה ציבורית BeanB1 מיישמת את IBeanB {...} @Component class class BeanB2 מיישמת את IBeanB {...} @Component class class BeanA {@ תלות IBeanB פרטית מאושרת; ...}

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

שגיאה ביצירת שעועית עם השם 'beanA': הזרקת תלות קווית אוטומטית נכשלה; יוצא מן הכלל המקונן הוא org.springframework.beans.factory.BeanCreationException: לא ניתן היה לבצע חוט אוטומטי בשדה: com com.baeldung.web.IBeanB com.baeldung.web.BeanA.b; יוצא מן הכלל המקונן הוא org.springframework.beans.factory.NoUniqueBeanDefinitionException: לא מוגדרת שעועית מזכה מסוג [com.baeldung.web.IBeanB]: שעועית תואמת יחידה צפויה אך נמצאה 2: beanB1, beanB2

4. סיבה: org.springframework.beans.BeanInstantiationException

4.1. חריג מותאם אישית

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

@Component class class BeanA {public BeanA () {super (); לזרוק NullPointerException חדש (); } ...}

כצפוי, זה יוביל לאביב לכישלון מהיר למעט החריג הבא:

שגיאה ביצירת שעועית עם השם 'beanA' שהוגדר בקובץ [... BeanA.class]: יישום השעועית נכשל; יוצא מן הכלל המקונן הוא org.springframework.beans.BeanInstantiationException: לא ניתן היה להניע את מעמד שעועית [com.baeldung.web.BeanA]: הקונסטרוקטור זרק חריג החריג המקונן הוא java.lang.NullPointerException

4.2. java.lang.InstantiationException

התרחשות אפשרית נוספת של BeanInstantiationException מגדיר מעמד מופשט כשעועית ב- XML; זה צריך להיות ב- XML ​​מכיוון שאין שום דרך לעשות זאת בקובץ Java @Configuration וסריקת מסלול בכיתה תתעלם מהמחלקה המופשטת:

@ כיתת מופשט ציבורית של רכיב BeanA מיישמת את IBeanA {...}

והגדרת ה- XML ​​של השעועית:

התקנה זו תביא לחריג דומה:

org.springframework.beans.factory.BeanCreationException: שגיאה ביצירת שעועית עם השם 'beanA' שהוגדר במשאב נתיב הכיתה [beansInXml.xml]: יישום השעועית נכשל; יוצא מן הכלל המקונן הוא org.springframework.beans.BeanInstantiationException: לא יכול היה להניע את מעמד השעועית [com.baeldung.web.BeanA]: האם זה מעמד מופשט ?; החריג המקונן הוא java.lang.InstantiationException

4.3. java.lang.NoSuchMethodException

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

@Component בכיתה ציבורית BeanA מיישמת את IBeanA {public BeanA (שם מחרוזת סופי) {super (); System.out.println (שם); }}

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

שגיאה ביצירת שעועית עם השם 'beanA' שהוגדר בקובץ [... BeanA.class]: יישום השעועית נכשל; יוצא מן הכלל המקונן הוא org.springframework.beans.BeanInstantiationException: לא ניתן היה להניע את מעמד השעועית [com.baeldung.web.BeanA]: לא נמצא קונסטרוקטור ברירת מחדל; יוצא מן הכלל המקונן הוא java.lang.NoSuchMethodException: com.baeldung.web.BeanA. ()

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

5. סיבה: org.springframework.beans.NotWritablePropertyException

אפשרות נוספת היא הגדרת שעועית - BeanA - עם התייחסות לשעועית אחרת - BeanB - מבלי שיש את שיטת הקביעה המתאימה ב- BeanA:

@Component בכיתה ציבורית BeanA {תלות IBeanB פרטית; ...} BeanB מייצגת את המחלקה הציבורית @Component IBeanB {...}

ותצורת ה- XML ​​באביב:

שוב, זה יכול להתרחש רק בתצורת XML, כי בעת שימוש ב- Java @תְצוּרָה, המהדר יהפוך את הנושא הזה לבלתי אפשרי להעתקה.

כמובן שכדי לפתור בעיה זו, צריך להוסיף את הקובע IBeanB:

@Component בכיתה ציבורית BeanA {תלות IBeanB פרטית; set public void setDependency (תלות סופית ב- IBeanB) {this.dependency = dependency; }}

6. סיבה: org.springframework.beans.factory.CannotLoadBeanClassException

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

שורש הסיבה אם ClassNotFoundException והחריג המלא במקרה זה הוא:

חריג מקונן הוא org.springframework.beans.factory.BeanCreationException: ... חריג מקונן הוא org.springframework.beans.factory.CannotLoadBeanClassException: לא יכול למצוא class [com.baeldung.web.BeanZ] עבור שעועית עם השם 'beanZ' מוגדר ב משאב נתיב מחלקה [beansInXml.xml]; החריג המקונן הוא java.lang.ClassNotFoundException: com.baeldung.web.BeanZ

7. ילדים של BeanCreationException

7.1. ה org.springframework.beans.factory.BeanCurrentlyInCreationException

אחת מתתי הקטעים של BeanCreationException האם ה BeanCurrentlyInCreationException; זה קורה בדרך כלל בשימוש בהזרקת קונסטרוקטור - למשל, במקרה של תלות מעגלית:

@Component בכיתה ציבורית BeanA מיישמת את IBeanA {IBeanB הפרטי beanB; @ BeanA ציבורי אוטומטי (שעועית IBeanB סופית) {סופר (); this.beanB = beanB; }} @Component בכיתה ציבורית BeanB מיישמת את IBeanB {גמר IBeanA beanA; @ BeanB ציבורי אוטומטי (שעועית IBeanA סופית) {סופר (); this.beanA = beanA; }}

האביב לא יוכל לפתור תרחיש חיווט מסוג זה והתוצאה הסופית תהיה:

org.springframework.beans.factory.BeanCurrentlyInCreationException: שגיאה ביצירת שעועית עם השם 'beanA': השעועית המבוקשת נמצאת כרגע ביצירה: האם יש התייחסות מעגלית בלתי פתירה?

היוצא מן הכלל המלא הוא מאוד מילולי:

org.springframework.beans.factory.UnsatisfiedDependencyException: שגיאה ביצירת שעועית עם השם 'beanA' שהוגדר בקובץ [... BeanA.class]: תלות לא מרוצה מבוטאת באמצעות ארגומנט קונסטרוקטור עם אינדקס 0 מהסוג [com.baeldung.web.IBeanB] :: שגיאה ביצירת שעועית עם השם 'beanB' שהוגדר בקובץ [... BeanB.class]: תלות לא מרוצה באה לידי ביטוי באמצעות ארגומנט קונסטרוקטור עם אינדקס 0 מסוג [com.baeldung.web.IBeanA]:: שגיאה ביצירת שעועית עם שם ' beanA ': שעועית מבוקשת נמצאת כרגע ביצירה: האם יש התייחסות מעגלית בלתי פתירה ?; יוצא מן הכלל המקונן הוא org.springframework.beans.factory.BeanCurrentlyInCreationException: שגיאה ביצירת שעועית עם השם 'beanA': השעועית המבוקשת נמצאת ביצירה: האם יש התייחסות מעגלית בלתי ניתנת לפתרון ?; חריג מקונן הוא org.springframework.beans.factory.UnsatisfiedDependencyException: שגיאה ביצירת שעועית עם השם 'beanB' שהוגדר בקובץ [... BeanB.class]: תלות לא מרוצה באה לידי ביטוי באמצעות ארגומנט קונסטרוקטור עם אינדקס 0 מסוג [com.baeldung.web .IBeanA]:: שגיאה ביצירת שעועית עם השם 'beanA': השעועית המבוקשת נמצאת כרגע ביצירה: האם יש התייחסות מעגלית בלתי פתירה ?; יוצא מן הכלל המקונן הוא org.springframework.beans.factory.BeanCurrentlyInCreationException: שגיאה ביצירת שעועית עם השם 'beanA': השעועית המבוקשת נמצאת ביצירה: האם יש התייחסות מעגלית בלתי ניתנת לפתרון?

7.2. ה org.springframework.beans.factory.BeanIsAbstractException

חריג מיידי זה עשוי להתרחש כאשר מפעל השעועית מנסה לאחזר ולייצר שעועית שהוכרזה כמופשטת; לדוגמה:

כיתת מופשטים ציבורית BeanA מיישמת את IBeanA {...}

הוכרז בתצורת XML כ:

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

@ תצורה בכיתה ציבורית Config {@Autowired BeanFactory beanFactory; @Bean הציבור BeanB beanB () {beanFactory.getBean ("beanA"); להחזיר BeanB חדש (); }}

זה יביא לחריג הבא:

org.springframework.beans.factory.BeanIsAbstractException: שגיאה ביצירת שעועית עם השם 'beanA': הגדרת שעועית היא מופשטת

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

org.springframework.beans.factory.BeanCreationException: שגיאה ביצירת שעועית עם השם 'beanB' שהוגדר במשאב נתיב הכיתה [org / baeldung / spring / config / WebConfig.class]: יישום השעועית נכשל; יוצא מן הכלל המקונן הוא org.springframework.beans.factory.BeanDefinitionStoreException: שיטת המפעל [com.baeldung.web.BeanB com.baeldung.spring.config.WebConfig.beanB ()] זרק חריג; החריג המקונן הוא org.springframework.beans.factory.BeanIsAbstractException: שגיאה ביצירת שעועית עם השם 'beanA': הגדרת שעועית היא מופשטת

8. מסקנה

בסוף מאמר זה, תהיה לנו מפה ברורה לנווט במגוון הגורמים והבעיות העלולים להוביל ל- BeanCreationException באביב, כמו גם הבנה טובה כיצד לפתור את כל הבעיות הללו.

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