【问题标题】:Spring BeanCreationException: cannot resolve reference to bean exceptionSpring BeanCreationException:无法解析对 bean 异常的引用
【发布时间】:2023-03-13 21:44:02
【问题描述】:

我正在以下网站尝试示例应用程序:

JSF 2, PrimeFaces 3, Spring 3 & Hibernate 4 Integration Project

但我发现在运行项目时,我得到:

严重:向 org.springframework.web.context.ContextLoaderListener 类的侦听器实例发送上下文初始化事件的异常 org.springframework.beans.factory.BeanCreationException:创建 ServletContext 资源 [/WEB-INF/applicationContext.xml] 中定义的名称为“UserService”的 bean 时出错:设置 bean 属性“userDAO”时无法解析对 bean“UserDAO”的引用;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 ServletContext 资源 [/WEB-INF/applicationContext.xml] 中定义名称为“UserDAO”的 bean 创建错误 [/WEB-INF/applicationContext.xml]

但是,在applicationContext.xml文件中,相关代码如下:

<!-- Beans Declaration -->
<bean id="User" class="com.otv.model.User"/>

<!-- User Service Declaration -->
<bean id="UserService" class="com.otv.user.service.UserService">
  <property name="userDAO" ref="UserDAO" />
</bean>

<!-- User DAO Declaration -->
<bean id="UserDAO" class="com.otv.user.dao.UserDAO">
 <property name="sessionFactory" ref="SessionFactory" />
</bean>

<!-- Session Factory Declaration -->
<bean id="SessionFactory"    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
 <property name="dataSource" ref="DataSource" />
 <property name="annotatedClasses">
  <list>
   <value>com.otv.model.User</value>
 </list>
</property>
<property name="hibernateProperties">
 <props>
  <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
  <prop key="hibernate.show_sql">true</prop>
 </props>

这些类确实存在于相关包中,如下所示以及各种配置文件的位置。

我可以看到本教程和我的实现之间的唯一区别是我使用的是 NetBeans 7.2 而不是 Eclipse。

有人知道这是为什么吗?

【问题讨论】:

  • 类UserDAO定义在包包com.otv.user.dao中;
  • 我的意思是 Spring bean 定义。如果它不存在,它就没有机会被注入。
  • 我是 Spring 的新手,所以我不太确定你的意思。但是 applicationContext.xml 指的是存在于所述包中的 UserService bean。
  • 继续跟踪异常跟踪的原因链,您可能会在底部找到真正的潜在错误。到目前为止,您发布的跟踪表明 Spring 无法创建 UserService,因为它依赖于 UserDAO,并且创建 UserDAO 时出错。您需要找出创建 UserDAO 时的错误是什么(这又可能是创建 SessionFactory 的错误,等等)。

标签: spring


【解决方案1】:
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserService' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'UserDAO' while setting bean property 'userDAO';

这告诉您,由于缺少属性定义,无法创建 UserService

 nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserDAO' defined in ServletContext resource [/WEB-INF/applicationContext.xml]

这告诉您找不到 UserDAO 的定义。

你缺少 UserDao 定义,ref 只是意味着它应该是那种类型,它仍然需要一个 bean 定义。

基本上,每当您使用“ref”时,您就是在告诉 spring 创建该类型的属性。该类型需要在其自己的 bean 定义中进行定义。

因此,如果 UserDao 使用了由“ref”定义的其他属性,那么该属性也需要自己的 bean 定义。

您必须将类和弹簧定义视为两个完全独立的实体。这些类可能存在并放置在它们应该放置的位置,但是 spring 需要它的 bean 定义才能调用它们。它不知道 UserDao 或 SessionFactory 是什么,除非您明确告诉它要调用哪个包/类。

【讨论】:

  • 好的。我在 applicationContext.xml 中有 UserDAO 定义,并且显示的代码已更改。但我仍然遇到同样的问题。
  • 现在你错过了 SessionFactory bean。也许您应该在发布问题之前完成基本教程。标记这个问题。
  • 那不公平。类是在它们应该在的地方创建的,但消息仍然出现在运行时导致失败。
  • Spring 总是会在运行时抛出这些异常,因为它们是运行时异常。好吧,这几乎没有解释任何事情。 Spring 使用 bean 定义在运行时调用类。因此,您将看到的唯一异常是运行时异常。
  • 我稍微更新了我的答案,因为我认为问题可能是您还没有完全理解本教程。公平地说,Spring 是一个很难破解的难题,因为它本质上不同于“正常的类设置”
【解决方案2】:

/WEB-INF/applicationContext.xml 应该包含类似&lt;bean id="UserDAO" class="com.otv.dao.UserDAO"&gt;...&lt;/bean&gt; 的条目,其属性很大程度上取决于所使用的后端系统。

我还怀疑 User bean 是一个错误的副本,因为 User 实例应该从 DAO 中检索或以编程方式创建。

至于为什么它在 Eclipse 中而不在 Netbeans 中起作用,这太奇怪了。一定有一些杂乱...

【讨论】:

    【解决方案3】:

    我找到了该错误的主要原因。其实很简单。

    com.otv.model.User类中,id字段上方没有@Id注解。

    这是导致我找出错误所在的答案链接:hibernate exception: org.hibernate.AnnotationException: No identifier specified for entity: com..domain.idea.MAE_MFEView

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 2017-06-30
      • 2013-01-04
      • 2014-08-24
      • 2014-09-29
      • 1970-01-01
      • 2023-01-19
      • 2022-10-25
      • 1970-01-01
      相关资源
      最近更新 更多