现在,关于“客户信息维护”的SSH框架已经结束,涉及到的后端操作包括增、删、查、改、生成Excel表格等。现在主要说说在创建过程中我经常遇到其中的几个问题。
问题一:
出现
严重:Exception sending context initialized event to listenerinstance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Errorcreating bean with name ‘entityManagerFactory‘ defined inServletContext resource [/WEB-INF/classes/applicationContext.xml]:Invocation of init method failed; nested exception isjava.lang.ExceptionInInitializerError Caused by: java.lang.ExceptionInInitializerError
或者
Error Creating SessionFactory java.lang.SecurityException: class"org.apache.commons.collections.SequencedHashMap
以上两个报错,是由于Spring 和 Hibernate 共用的一些 jar 文件发生了版本冲突, 删除 WEB-INF/lib/asm-2.2.3.jar即可
问题二:
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 15 in XML document from ServletContext resource [/WEB-INF/applicationContext.xml] is invalid;nested exception is org.xml.sax.SAXParseException; lineNumber: 15; columnNumber: 3; The markup in the document following the root element must be well-formed.
启动服务,出现以上报错 ,网上搜了一下,主要原因有:
1、复制粘贴时,可能粘贴进去乱码了。需要手动输入。
2、在applicationContext.xml文件中,开头有空格,导致识别不了文件。即要确保xml的第一句<?xml version="1.0" encoding="UTF-8"?>之前没有空格。
3、配置文件声明中缺少context。
4、在配置spring的配置文件时,抛出nested exception is org.xml.sax.SAXParseException; lineNumber: 15; columnNumber的异常,原因就是没有正确的添加命名空间。
5、在xml中这样引用 properties文件的:<import resource="classpath:application.properties"/>
改成 <context:property-placeholder location="classpath:application.properties" />就好了
6、元素 ‘property‘ 必须不含字符 [子级], 因为该类型的内容类型为“仅元素”。
可以将
<property name="url">${hibernate.connection.url}</property>
改为
<property name="url">${hibernate.connection.url}/>
7、开头缺少<web-app>,即XML文档中标记的地方格式不合法,通不过dtd的验证,所以要符合规范,在xml文件的开头加上
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> </web-app>
问题三:
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/classes/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/classes/applicationContext.xml] Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/classes/applicationContext.xml]
出现如上错误,查了下,网上说的错误原因基本都是:发生在web.xml的配置有问题,要加上如下代码如下:
在web.xml文件中加入:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/applicationContext.xml</param-value> </context-param>
或者
<init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </init-param>
问题的原因主要是:问题主要由于加载spring的默认配置文件位置一般是在/WEB-INF/下找applicationContext.xml文件,eclipse文件自动生成的applicationContext文件是放在/WEB-INF/classes/applicationContext.xml,所以在默认加载中是找不到applicationContext.xml文件的,必须加入上面配置。
无论加了哪种,我的加上以后又报下面的错:
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/classes/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/classes/applicationContext.xml] Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/classes/applicationContext.xml]
1、查到的问题及解决办法有的跟上面的相同,即在web.xml中加入这些配置
<context-param> <param-name>contextConfigLocation </param-name> <param-value>/WEB-INF/classes/applicationContext.xml </param-value> </context-param>
或者将IDE自动生成的applicationContext.xml放到WEB-INF 文件夹下即可。
2、可能是你的applicationContext.xml没有正确引入外部数据源
例如:<!-- 引入数据源 -->
<context:property-placeholder location="classpath:db.properties"/>
问题四:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactory‘ defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.InvalidMappingException: Could not parse mapping document from input stream Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from input stream
这个错误我遇到好几次,网上找了好多方法来试,都没成功。
最后,将bean下的Cust.hbm.xml文件中的
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
改为
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
这样就可以了。