当前位置:首页 > 科技  > 软件

SpringBoot这些异常你知道原因吗?你遇过到几个?

来源: 责编: 时间:2024-09-10 09:51:01 247观看
导读环境:SpringBoot3.2.51. 简介在篇文章,我们将详细讨论 BeanCreationException 异常。这是 BeanFactory 在创建定义的 Bean 时遇到问题时抛出的一种非常常见的异常。本文将探讨导致这种异常的最常见原因以及解决方案。2.

环境:SpringBoot3.2.5IBG28资讯网——每日最新资讯28at.com

1. 简介

在篇文章,我们将详细讨论 BeanCreationException 异常。这是 BeanFactory 在创建定义的 Bean 时遇到问题时抛出的一种非常常见的异常。本文将探讨导致这种异常的最常见原因以及解决方案。IBG28资讯网——每日最新资讯28at.com

2. 异常分类

2.1 NoSuchBeanDefinitionException

该异常的原因是 Spring 尝试注入一个容器中不存在的 Bean,如下示例:IBG28资讯网——每日最新资讯28at.com

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

这里UserDAO类上并没有添加任何注解,当启动容器时,抛出如下错误IBG28资讯网——每日最新资讯28at.com

图片图片IBG28资讯网——每日最新资讯28at.com

遇到该异常,那你就要检查UserDAO类上是否添加了@Component, @Repository, @Service, @Controller, 这些注解(或者配置类中使用@Bean)。还有一点是,当前这个类所在的包在当前扫描的范围内。IBG28资讯网——每日最新资讯28at.com

2.2 NoUniqueBeanDefinitionException

该异常的原因是 Spring 在注入某个抽象类(接口)时,发现容器中存在多个,如下示例:IBG28资讯网——每日最新资讯28at.com

public interface DAO {}@Componentpublic class CommonDAO implements DAO {}@Componentpublic class PersonDAO implements DAO {}@Servicepublic class UserService {  @Resource  private DAO dao ;}

启动容器后,抛出如下错误IBG28资讯网——每日最新资讯28at.com

图片图片IBG28资讯网——每日最新资讯28at.com

解决办法就是指定名称,上面使用的@Resource可以指定name属性IBG28资讯网——每日最新资讯28at.com

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

如果你使用的@Autowired,那么你可以使用@QualifierIBG28资讯网——每日最新资讯28at.com

2.3 BeanInstantiationException

出现该异常的原因是在创建实例对象时,如下示例:IBG28资讯网——每日最新资讯28at.com

创建对象抛出了异常

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

在构造函数中,执行相关的操作时,抛出了异常,错误信息如下:IBG28资讯网——每日最新资讯28at.com

图片图片IBG28资讯网——每日最新资讯28at.com

抽象类定义为BeanIBG28资讯网——每日最新资讯28at.com

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

抛出错误如下:IBG28资讯网——每日最新资讯28at.com

图片图片IBG28资讯网——每日最新资讯28at.com

根据异常信息提示,已经告诉你是否是抽象类。IBG28资讯网——每日最新资讯28at.com

2.4 NoSuchBeanDefinitionException

如果一个 Bean 没有默认构造函数(无参的),而是定义了有参的构造函数,那么如果容器中不存在参数类型的bean,那么会抛出该异常,如下示例:IBG28资讯网——每日最新资讯28at.com

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

抛出异常IBG28资讯网——每日最新资讯28at.com

图片图片IBG28资讯网——每日最新资讯28at.com

检查容器中是否有一个String类型的Bean对象。IBG28资讯网——每日最新资讯28at.com

2.5 NotWritablePropertyException

该异常出现的概率非常小,因为我们现在都是基于注解的方式去配置bean,很少使用xml方式,除了xml方式为,我们还可以通过注册BeanDefinition方式来来注册Bean,接下来我们通过注册BeanDefinition方式来设置bean的相关属性,如下示例:IBG28资讯网——每日最新资讯28at.com

public class UserService {  private DAO dao ;}

该类并没有对dao属性定义setter方法。接下来,通过如下方式注册上面的Bean对象:IBG28资讯网——每日最新资讯28at.com

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

通过BeanDefinition方式注册bean,并添加属性,运行程序后抛出如下错误:IBG28资讯网——每日最新资讯28at.com

图片图片IBG28资讯网——每日最新资讯28at.com

2.6 BeanCurrentlyInCreationException

该异常通常发生在使用构造器注入时,例如循环依赖的情况下,如下示例:IBG28资讯网——每日最新资讯28at.com

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

抛出如下错误IBG28资讯网——每日最新资讯28at.com

图片IBG28资讯网——每日最新资讯28at.com

异常信息中已经描述了,是否是循环依赖,解决改异常,可以在任意一方使用@Lazy注解即可,如下示例:IBG28资讯网——每日最新资讯28at.com

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

这里只需要在任何一方的参数上添加@Lazy注解即可解决该循环依赖问题。IBG28资讯网——每日最新资讯28at.com

2.7 BeanDefinitionOverrideException

当容器中出现beanName相同的情况(不允许覆盖),则抛出该异常,如下示例:IBG28资讯网——每日最新资讯28at.com

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

这里定义了2个beanName都为xxxooo的对象,默认情况下,springboot是不允许覆盖的,如下属性配置:IBG28资讯网——每日最新资讯28at.com

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

在这种情况下,启动时将抛出如下错误:IBG28资讯网——每日最新资讯28at.com

图片图片IBG28资讯网——每日最新资讯28at.com

当设置为true,以后,容器中将存在的将是xxxooo=com.pack.B。后面的会覆盖前面定义的bean。IBG28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-112783-0.htmlSpringBoot这些异常你知道原因吗?你遇过到几个?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Java8 中一个极其强悍的新接口,很多人没用过

下一篇: 这应该是全网最详细的Vue3.5版本解读

标签:
  • 热门焦点
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页“充值中心”入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就“胡锡进炒股是否知道认真报道”展开讨论。有
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
  • Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
Top