【问题标题】:BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resourceBeanCreationException:创建 ServletContext 资源中定义的名称为“sessionFactory”的 bean 时出错
【发布时间】:2014-07-18 11:17:30
【问题描述】:

我正在使用休眠 3.2.7 和弹簧 3.2.8。错误是***

**":在 ServletContext 资源 [/WEB-INF/spring-servlet.xml] 中定义名称为“sessionFactory”的 bean 创建错误:调用 初始化方法失败;嵌套异常是 java.io.FileNotFoundException: ServletContext 资源 [/resources/hibernate.cfg.xml] 不能 解析为 URL,因为它不存在”。


我尝试将 hibernate.cfg.xml 放在 src、webinf 和 classpath: 中,但仍然找不到它。这是我的错误堆栈跟踪:

> org.springframework.beans.factory.BeanCreationException: Error
> creating bean with name 'sessionFactory' defined in ServletContext
> resource [/WEB-INF/spring-servlet.xml]: Invocation of init method
> failed; nested exception is java.io.FileNotFoundException:
> ServletContext resource [/resources/hibernate.cfg.xml] cannot be
> resolved to URL because it does not exist     at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1512)
>   at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
>   at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
>   at
> org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
>   at
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
>   at
> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
>   at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
>   at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:610)
>   at
> org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
>   at
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
>   at
> org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651)
>   at
> org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:602)
>   at
> org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)
>   at
> org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:521)
>   at
> org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:462)
>   at
> org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
>   at javax.servlet.GenericServlet.init(GenericServlet.java:158)   at
> org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
>   at
> org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
>   at
> org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
>   at
> org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5210)
>   at
> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5493)
>   at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
>   at
> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
>   at
> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
>   at
> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
>   at
> org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:670)
>   at
> org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1839)
>   at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>   at java.util.concurrent.FutureTask.run(FutureTask.java:262)     at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>   at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>   at java.lang.Thread.run(Thread.java:745) Caused by:
> java.io.FileNotFoundException: ServletContext resource
> [/resources/hibernate.cfg.xml] cannot be resolved to URL because it
> does not exist    at
> org.springframework.web.context.support.ServletContextResource.getURL(ServletContextResource.java:154)
>   at
> org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBe

我的 spring-servlet 是:

<bean
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix">
    <value>/</value>
  </property>
  <property name="suffix">
    <value>.xhtml</value>
  </property>
</bean>

<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="/WEB-INF/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>resources/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>
            <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>

>

【问题讨论】:

  • 尝试使用classpath:hibernate.cfg.xml 而不是resources/hibernate.cfg.xml 似乎网址resources/hibernate.cfg.xml 不存在,这是正确的。使用 maven 样式时,您不需要 resources 引用。这是假设您的 Maven 文件结构是 src/main/resources/hibernate.cfg.xml

标签: spring hibernate


【解决方案1】:

LocalSessionFactoryBean 的属性configLocation 的类型为Resource,可以用前缀指定资源的类型,例如:

classpath:resources/hibernate.cfg.xml

默认情况下,在 ServletContext 中,如果不指定前缀,则资源使用类ServletContextResource。来自 Spring 文档:

5.3.4 ServletContextResource

这是 ServletContext 资源的 Resource 实现,解释相关 Web 应用程序根目录中的相对路径。

这始终支持流访问和 URL 访问,但仅在扩展 Web 应用程序存档并且资源物理位于文件系统上时才允许 java.io.File 访问。它是否像这样在文件系统上进行扩展,或者直接从 JAR 或其他地方(如 DB)访问(这是可以想象的)实际上取决于 Servlet 容器。

然后,您需要将前缀或资源放在应用程序的根目录中。

您可以在 spring 文档中的Resources 中查看所有 abaout 资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多