搭建SSH框架解決的小問題org.springframework.beans.factory.BeanCreationException

在以前搭建的一個SSH框架Demo在今天運行時報瞭如下錯誤信息:

嚴重: 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 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.InvalidMappingException: Could not parse mapping document from input stream
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4791)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285)
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:618)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1100)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1618)
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:744)
Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from input stream
at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:555)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:677)
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
... 25 more
Caused by: org.dom4j.DocumentException: www.hibernate.org Nested exception: www.hibernate.org
at org.dom4j.io.SAXReader.read(SAXReader.java:484)
at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:546)
... 29 more


然後從網上找了一些資料及解決問題的方法,發現只要在Spring的配置文件中:

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">  
            <list>  
                <value>com/myssh2/beans/User.hbm.xml</value>  
            </list>  
        </property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
</bean>

裏面添加

<!-- 驗證 -->
<prop key="javax.persistence.validation.mode">
none
</prop>

最後形成的文件塊爲:

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">  
            <list>  
                <value>com/myssh2/beans/User.hbm.xml</value>  
            </list>  
        </property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<!-- 驗證 -->
<prop key="javax.persistence.validation.mode">
none
</prop>
</props>
</property>
</bean>

然後Demo成功運行。

具體原因分析: Hibernate Annotations (即 Hibernate 3.5.x) 中包含了一個的Hibernate 事件監聽器(譯註: 請閱讀Hibernate Core文檔瞭解Hibernate的事件模型) - org.hibernate.cfg.beanvalidation.BeanValidationEventListener - 來爲Hibernate Validator服務. 當一個 PreInsertEvent , PreUpdateEvent 或 PreDeleteEvent 事件發生的時候, 這個監聽器就可以對該事件所涉及到的實體對象進行校驗, 如果校驗不通過的話, 則拋出異常. 默認情況下, Hibernate在對每個對象進行保存或者修改操作的時候,都會對其進行校驗, 而刪除操作則不會. 你可以通過javax.persistence.validation.group.pre-persist, javax.persistence.validation.group.pre-update 和 javax.persistence.validation.group.pre-remove屬性來定義對應事件發生的時候, 具體要校驗哪(些)個校驗組, 這個屬性的值是要應用的校驗組類的全路徑, 使用逗號分隔. 例 7.1 “自定義BeanValidationEvenListener”顯示了這幾個屬性在Hibernate內部定義的默認值, 所以, 你不需要在你的應用中再重複定義了.


如果發生了違反約束條件的情況, 該監聽器會拋出一個運行時的 ConstraintViolationException 異常, 此異常包含了一系列的 ConstraintViolation 對象用於描述每個違反了約束條件的情況.


      如果類路徑上有Hibernate Validator, 則Hibernate Annotations (或 Hibernate EntityManager)會自動調用它, 如果你想避免這種情況, 可以設置javax.persistence.validation.mode屬性爲 none .

參考資料:http://docs.jboss.org/hibernate/validator/4.2/reference/zh-CN/html/validator-integration.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章