【问题标题】:Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource' .factory.NoSuchBeanDefinitionException:设置bean属性'dataSource'时无法解析对bean'dataSource'的引用.factory.NoSuchBeanDefinitionException:
【发布时间】:2016-08-19 04:50:46
【问题描述】:

这是在我的 spring-servlet.xml 文件中定义的具有此 ID 的 bean

<bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
        p:password="${jdbc.password}" />

这是完整的堆栈跟踪

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 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [META-INF/spring/hibernate-context.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'dataSource' is defined
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)

这是我的 WEB-INF 文件夹中定义的应用程序上下文文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
</beans>

这是我完整的 web.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>YummyFoods</display-name>
  <welcome-file-list>
    <welcome-file>/JSP/welcome.jsp</welcome-file>
  </welcome-file-list>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>imageServlet</servlet-name>
    <servlet-class>com.yummyfoods.spring.servlet.ImageServlet</servlet-class>
</servlet>
  <servlet-mapping>
    <servlet-name>imageServlet</servlet-name>
    <url-pattern>/image/*</url-pattern>
</servlet-mapping>
<error-page>
    <error-code>404</error-code>
    <location>/error</location>
</error-page>
</web-app>

这是我的 spring-servlet.xml 文件

<mvc:resources location="/resources/" mapping="/resources/**"/>
    <mvc:default-servlet-handler/>          
    <bean id="jspViewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/JSP/" />
        <property name="suffix" value=".jsp" />
    </bean>

        <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:messages" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>


    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="classpath:jdbc.properties" />

    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
        p:password="${jdbc.password}" />


    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>classpath:hibernate-cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
                 <prop key="hibernate.connection.SetBigStringTryClob">true</prop>
                <prop key="hibernate.jdbc.batch_size">0</prop>
            </props>
        </property>
    </bean>

    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

        <!-- one of the properties available; the maximum file size in bytes -->
        <property name="maxUploadSize" value="10000000" />
    </bean>

    <tx:annotation-driven />
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>

请帮我找路。

【问题讨论】:

  • 显示您的 Spring 应用程序上下文文件。从外观上看,您是在 DispatcherServlet 上下文配置文件中定义数据源。以及根应用程序上下文文件中的 entityManagerFactory。根应用程序上下文中的 Bean 不能引用 servlet 应用程序上下文文件中的那些。您需要将 dataSource bean 移动到其他 xml 配置文件
  • 如果您有web.xml,请发布...
  • 是的。我愿意。我要展示它吗
  • @JnG 你能显示你的 hibernate-context.xml 文件吗?
  • 你应该在applicationContext 中定义bean 和commons 的东西,在spring-servlet.xml 中定义servlet 特定的东西

标签: java xml spring hibernate spring-mvc


【解决方案1】:

从外观上看,您在 DispatcherServlet 上下文配置文件中定义数据源,即您指定的 spring-servlet.xml。以及 根应用程序上下文 文件中的 entityManagerFactory。根应用程序上下文中的 Bean 不能引用 servlet 应用程序上下文文件中的那些。您需要将 dataSource bean 移动到 hibernate-context.xml 文件中。

【讨论】:

  • META-NF/spring/hibernate-context.xml 怎么样。正如我所说,在该文件中定义 dataSource 而不是 spring-servlet.xml
  • 我的 WEB-INF 文件夹中只有 spring-servlet.xml 文件和 applicationContext.xml
【解决方案2】:

你的依赖会带来什么?我认为您应该在applicationContext.xml 中包含您的数据源定义,然后休眠的事情应该很高兴。

所以...

<bean id="dataSource"
         class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
         p:driverClassName="${jdbc.driverClassName}"
         p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
         p:password="${jdbc.password}" />

 <bean id="sessionFactory"
         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
         <property name="dataSource" ref="dataSource" />
         <property name="configLocation">
             <value>classpath:hibernate-cfg.xml</value>
         </property>
         <property name="configurationClass">
             <value>org.hibernate.cfg.AnnotationConfiguration</value>
         </property>
         <property name="hibernateProperties">
             <props>
                 <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                 <prop key="hibernate.show_sql">true</prop>
                  <prop key="hibernate.connection.SetBigStringTryClob">true</prop>
                 <prop key="hibernate.jdbc.batch_size">0</prop>
             </props>
         </property>
     </bean>
 <tx:annotation-driven />
     <bean id="transactionManager"
         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
         <property name="sessionFactory" ref="sessionFactory" />
     </bean>

进入applicationContext.xml 并从spring-servlet.xml 中删除

然后嵌入在会话工厂def中的hibernate-cfg.xml应该找到它的数据源并在加载时很高兴。

最好将 servlet 映射和 mvc 定义与后端东西(bean 工厂等)隔离开来,因为如果需要,将来更容易更改它。

你用什么来构建你的应用程序?

【讨论】:

  • 如果您有意见,请发表评论。这不是答案
  • 我不认为给出完整的代码来回答这个问题对操作有帮助,但可以做到。
  • 如果你这么认为,请发布 sn-ps
  • 我在 spring-servlet 类中找不到这个类路径:hibernate-cfg.xml org.hibernate.cfg.AnnotationConfiguration ${jdbc.dialect} true
  • 看看你的 sessionFactory def(我的第一次尝试时我的 foating 出了问题,抱歉)。
猜你喜欢
  • 2017-08-17
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2020-06-26
  • 2012-09-18
  • 2018-04-29
  • 1970-01-01
相关资源
最近更新 更多