成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot這些異常你知道原因嗎?你遇過到幾個?

開發 前端
遇到該異常,那你就要檢查UserDAO類上是否添加了@Component, @Repository, @Service, @Controller, 這些注解(或者配置類中使用@Bean)。還有一點是,當前這個類所在的包在當前掃描的范圍內。

環境:SpringBoot3.2.5

1. 簡介

在篇文章,我們將詳細討論 BeanCreationException 異常。這是 BeanFactory 在創建定義的 Bean 時遇到問題時拋出的一種非常常見的異常。本文將探討導致這種異常的最常見原因以及解決方案。

2. 異常分類

2.1 NoSuchBeanDefinitionException

該異常的原因是 Spring 嘗試注入一個容器中不存在的 Bean,如下示例:

public class UserDAO {}
@Service
public class UserService {
  @Resource
  private UserDAO dao ;
}

這里UserDAO類上并沒有添加任何注解,當啟動容器時,拋出如下錯誤

圖片圖片

遇到該異常,那你就要檢查UserDAO類上是否添加了@Component, @Repository, @Service, @Controller, 這些注解(或者配置類中使用@Bean)。還有一點是,當前這個類所在的包在當前掃描的范圍內。

2.2 NoUniqueBeanDefinitionException

該異常的原因是 Spring 在注入某個抽象類(接口)時,發現容器中存在多個,如下示例:

public interface DAO {}
@Component
public class CommonDAO implements DAO {}
@Component
public class PersonDAO implements DAO {}
@Service
public class UserService {
  @Resource
  private DAO dao ;
}

啟動容器后,拋出如下錯誤

圖片圖片

解決辦法就是指定名稱,上面使用的@Resource可以指定name屬性

@Service
public class UserService {
  @Resource(name = "personDAO")
  private DAO dao ;
}

如果你使用的@Autowired,那么你可以使用@Qualifier

2.3 BeanInstantiationException

出現該異常的原因是在創建實例對象時,如下示例:

創建對象拋出了異常

@Controller
public class UserController {
  public UserController() {
    // TODO
    throw new RuntimeException("異常了") ;
  }
}

在構造函數中,執行相關的操作時,拋出了異常,錯誤信息如下:

圖片圖片

抽象類定義為Bean

@Controller
public abstract class UserController {
  public UserController() {
  }
}

拋出錯誤如下:

圖片圖片

根據異常信息提示,已經告訴你是否是抽象類。

2.4 NoSuchBeanDefinitionException

如果一個 Bean 沒有默認構造函數(無參的),而是定義了有參的構造函數,那么如果容器中不存在參數類型的bean,那么會拋出該異常,如下示例:

@Component
public class User {
  public User(String name) {
    System.out.println(name) ;
  }
}

拋出異常

圖片圖片

檢查容器中是否有一個String類型的Bean對象。

2.5 NotWritablePropertyException

該異常出現的概率非常小,因為我們現在都是基于注解的方式去配置bean,很少使用xml方式,除了xml方式為,我們還可以通過注冊BeanDefinition方式來來注冊Bean,接下來我們通過注冊BeanDefinition方式來設置bean的相關屬性,如下示例:

public class UserService {
  private DAO dao ;
}

該類并沒有對dao屬性定義setter方法。接下來,通過如下方式注冊上面的Bean對象:

ConfigurableApplicationContext context = ...
context.registerBean("userService", UserService.class, bd -> {
  bd.getPropertyValues().add("dao", xxx) ;
}) ;

通過BeanDefinition方式注冊bean,并添加屬性,運行程序后拋出如下錯誤:

圖片圖片

2.6 BeanCurrentlyInCreationException

該異常通常發生在使用構造器注入時,例如循環依賴的情況下,如下示例:

@Component
public class A {
  public A(B b) {}
}
@Component
public class B {
  public B(A a) {
  }
}

拋出如下錯誤

圖片

異常信息中已經描述了,是否是循環依賴,解決改異常,可以在任意一方使用@Lazy注解即可,如下示例:

public class A {
  public A(@Lazy B b) {}
}

這里只需要在任何一方的參數上添加@Lazy注解即可解決該循環依賴問題。

2.7 BeanDefinitionOverrideException

當容器中出現beanName相同的情況(不允許覆蓋),則拋出該異常,如下示例:

@Component("xxxooo")
public class A {
}
@Component("xxxooo")
public class B {
}

這里定義了2個beanName都為xxxooo的對象,默認情況下,springboot是不允許覆蓋的,如下屬性配置:

spring:
  main:
    allow-bean-definition-overriding: false

在這種情況下,啟動時將拋出如下錯誤:

圖片圖片

當設置為true,以后,容器中將存在的將是xxxooo=com.pack.B。后面的會覆蓋前面定義的bean。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2023-01-16 08:09:51

SpringMVC句柄

2021-03-29 09:37:17

SpringBoot常用注解Spring Boot

2024-02-26 08:19:00

WebSpring容器

2021-06-01 05:16:49

前端開發技術熱點

2020-10-28 11:20:55

vue項目技

2019-07-25 10:45:05

GitHub技巧網站

2018-05-11 15:53:59

2021-10-14 06:52:47

算法校驗碼結構

2017-10-11 13:42:40

DIY裝機電腦

2020-11-18 07:52:08

2020-12-24 15:26:07

Redis數據庫

2019-10-28 09:53:42

Java開發結構

2021-10-25 14:55:38

Linux技巧命令

2015-06-29 09:06:51

2018-07-26 08:42:11

2021-04-27 07:52:18

跳槽數據分析

2024-10-15 11:37:06

2023-01-31 09:02:24

JSVMVR

2023-04-27 08:15:09

2015-07-03 11:20:41

編程學習方法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩视频中文字幕 | 欧美aaa| 中文字幕亚洲国产 | 中文字幕av在线 | 日韩欧美国产一区二区三区 | 99亚洲精品| 精品视频一区二区 | 欧美一区二区免费 | 亚洲人成在线播放 | 天天操天天插天天干 | 国户精品久久久久久久久久久不卡 | 国产精品免费福利 | 国产成人高清 | 精品无码久久久久久国产 | 久精品久久 | 亚洲成人免费视频在线观看 | 久久精品一区 | 视频精品一区二区三区 | 美国一级黄色片 | 日韩精品一区二区三区在线播放 | 操操日 | 欧美1区| 欧美精品一区二区在线观看 | 国产一区精品 | 在线视频国产一区 | 国产一区二区影院 | 欧美一级毛片久久99精品蜜桃 | 精品福利一区二区三区 | 亚洲精品九九 | 国产三级一区二区三区 | 成人精品一区二区三区中文字幕 | www日| 亚洲视频精品 | 一级片免费在线观看 | 亚洲高清视频在线观看 | 色www精品视频在线观看 | 少妇一级淫片免费放播放 | 亚洲一区二区三区视频在线 | 亚洲天堂精品久久 | 精品av| 青青草一区 |