【问题标题】:Spring - Instanciate a bean with a class which throws an ExceptionSpring - 用一个抛出异常的类实例化一个 bean
【发布时间】:2013-11-06 14:24:45
【问题描述】:

我正在尝试实例化一个构造函数可以抛出异常的 bean。 我无法修改这个类(由外部团队提供)。

<bean id="myClass" class="myClass" />

myClass 构造函数抛出异常。

我一直在考虑用单例模式扩展这个类,这是我想要的行为(确保只实例化 MyClass 的一个实例)。

错误信息:

嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 用名字创建bean '我的课' 在类路径资源中定义 [.../spring_applicationContext.xml]: bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:不能 实例化 bean 类 [我的课]: 构造函数抛出异常;嵌套异常是 java.lang.ExceptionInInitializerError

提前感谢您的回答

我认为问题在于我的构造函数抛出了异常。

我的问题是:使用 Spring,是否可以使用可能引发异常的构造函数来实例化 bean?

【问题讨论】:

    标签: spring


    【解决方案1】:

    如果 bean 配置文件中没有指定 bean 范围,默认为单例。你的 bean myClass 是一个单例,你不需要做更多的事情。
    Spring Doc

    【讨论】:

    • 感谢您的回答。我知道 Spring 默认管理单例。但是如果我尝试使用 Spring,当它尝试加载上下文时会出现异常(因为 myClass 的构造函数会抛出异常)
    • @Galephico:正如 Anders 所说,添加完整的堆栈跟踪有助于识别问题。
    • 我认为问题出在我的构造函数抛出异常的事实。我的问题是:使用 Spring,是否可以使用可能抛出异常的构造函数来实例化 bean?
    • @Galephico:如果构造函数抛出异常,您对 Spring 的期望是什么? Spring 不够聪明,无法处理异常并仍然创建 bean。此外,异常是从静态块引发的,因此您需要与外部团队/文档进行检查。
    • 我认为 Spring 错误是由于 myClass 可能 抛出异常,而不是在 Spring 尝试实例化光束时它确实抛出异常。因为我在执行 MyClass myClass = new MyClass() 时没有任何错误。感谢您对您和@Anders Rostgaard Bystrup 的不同回答
    【解决方案2】:

    Spring bean 默认是单例的。

    您应该提供更多的堆栈跟踪 - 您所显示的表明问题不是 myClass,而是引发异常的 ClassPathXmlApplicationContext 构造函数 - 原因通常在堆栈跟踪的后面出现。

    干杯,

    【讨论】:

    • 如果myClass 构造函数真的抛出了异常,你无论如何都不走运 - 你需要弄清楚它为什么这样做并修复它!
    • 它抛出一个异常,因为它访问属性并且我不能修改 myClass,不幸的是。这就是为什么我想到单例模式来实例化 myClass
    • 好的,如果构造函数抛出异常,那么对象就没有被构造,因此对你没有用处!如果您通过“...访问属性...”表示构造函数需要一个属性文件,您应该在类路径上提供它!底线:你必须解决异常情况,否则你将一事无成!
    • 顺便说一句,ExceptionInInitializerError 通常是由 static 上下文(初始化程序/变量)中的异常引起的 - 您可以反编译该类并了解根本原因。
    【解决方案3】:

    根据堆栈跟踪,在创建类“myClass”的对象时,静态块或变量中似乎存在意外错误。

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2013-02-17
      • 2013-07-09
      • 2012-09-12
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      相关资源
      最近更新 更多