SSH常見錯誤

iteye_9089發表於2020-04-07
Spring Hibernate在AOP方面的配置衝突
Spring2.0 Hibernate3.1.x/Hibernate3.2

在使用Spring的AOP程式設計時,會用到這幾個lib:
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar

Hibernate如果使用lib:
asm.jar
asm-attrs.jar

其中asm-2.2.2.jar與asm.jar存在類上的衝突!!!
使用其中之一或兩者都使用,可能會出現如下錯誤:
java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit。。。。。。

解決辦法是:
1).去掉類路徑上的關於Hibernate的3個lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
2).加入Spring中的以下4個lib
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
cglib-nodep-2.1_3.jar

如果再不行,都試試刪刪看。


java.lang.SecurityException: class "javax.xml.bind.JAXBContext"'s signer information does not match signer information of other classes in the same package
這個錯誤是因為載入的包裡面有兩個相同路徑的類,就是在一個包裡面有兩個同名的類
有可能是將相同的包載入兩次或者把包解開後,先將jar檔案載入了,後又將解開的類載入了


Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
試試自己去下一個spring的包,把包裡的spring.jar加到專案裡去。eclipse生成的時候可能會有些包沒有放進去。


Error creating bean with name 'datasource' defined in file
Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
試試將commons-dbcp.jar,commons-pool.jar和commons- collections.jar加入CLASSPATH中


hibernate 3.1 中的hibernateTemplate ,class應該為org.springframework.orm.hibernate3.HibernateTemplate,而非org.springframework.orm.hibernate.HibernateTemplate,因為某些原因我現在還用3.1,早前在玩springside的時候感覺hibernate 3.2 的Hibernate Annotations方便多了。

找不到action或報錯的另一少有原因,一些版本hibernate版本會有些衝突方面的問題,可換一版本的hibernate試試,個人感覺hibernate的版本對應用會比較敏感


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in resource [/WEB-INF/dataAccessContext-hibernate.xml] of ServletContext: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/TransactionManager
java.lang.NoClassDefFoundError: javax/transaction/TransactionManager

原因:缺少jta.jar 或者是找不到hbm.xml檔案導致sessionfactory出錯,檢查hbm檔案路徑是否正確,檔案是否存在
<property name="mappingResources">
<list>
<value>com/yourcompany/model/Login.hbm.xml
</value>
</list>
</property>

另外,此出錯也有可能是HBM檔案裡的錯誤引起,比如當初設計表的時候建立好了表間的約束關係,所以當生成其中一些持久化類,而另外一些有關聯的表沒有生成持久化類的時候。hbm檔案裡也會有生成相關的一對多多對一等的關聯,而另外的表沒有生成持久化類。所以執行時就會報這個錯誤。將HBM檔案裡暫時沒有使用到的配置刪除就可以了。


2007-06-26 18:38:13,671 ERROR [com.yourcompany.model.dao.LoginDAO] - <save failed>
org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not insert: [com.yourcompany.model.Login]; bad SQL grammar [insert into mysql__login (name, password) values (?, ?)]; nested exception is java.sql.SQLException: Table 'mysql.mysql__login' doesn't exist
java.sql.SQLException: Table 'mysql.mysql__login' doesn't exist

把hbm檔案裡面的catalog="'mysql"去掉即可!
另注意的一點是eclipse生成的DAO檔案應該是:
public void save(Login transientInstance) {
log.debug("saving Login instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
而不是原來的 public void save(LoginDAO transientInstance)

只要在applicationContext.xml中加上
<property name="mappingResources">
<list>
<value>com/yourcompany/hibernate/Users.hbm.xml</value>
</list>
</property>
加這段程式碼就會找不到action
換一個版本的hibernate應該就ok


Invalid path /addcustomer was requested
輸入的路徑不正確,檢查spring中註冊的action的路徑和輸入的路徑是否一致,留意大小寫是否一致

2007-08-08 15:36:17,406 ERROR [org.hibernate.proxy.BasicLazyInitializer] - CGLIB Enhancement failed: dao.User
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77)

Spring 和 Hibernate 共用的一些 jar 檔案發生了版本衝突, 刪除 WEB-INF/lib/asm-2.2.3.jar 然後重啟 Tomcat.

asm-2.2.3.jar
asm.jar
asm-attrs.jar
asm-commons-2.2.3.jar
asm-util-2.2.3.jar

另外,如果報以下錯:

Caused by: java.lang.SecurityException: class "org.objectweb.asm.CodeVisitor"'s signer information does not match signer information of other classes in the same package

也是由於上一個原因,即Spring 和 Hibernate 共用的一些 jar 檔案發生了版本衝突,需要刪除asm-2.2.3.jar


Resources cannot be null
關於這個異常除了大家說的之外,如果在struts-config.xml的配置中不載入驗證外掛,也是會報上述錯誤的,請在配置檔案中加上
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>


hibernate java.lang.NullPointerException

檢查一下配置檔案。
比如struts-config裡,action的名稱和路徑是否一致,是否和spring裡註冊的名字一致。特別留意大小寫。hbm檔案配置是否有錯,大小寫。。。

----------------------------------------------------------------------------------------------

%%%%Error Creating SessionFactory %%%% java.lang.SecurityException: class"org.apache.commons.collections.SequencedHashMap"'s signer informationdoes not match signer information of other classes in the same package
因為我用的6.0.1,所以怎麼也沒出現這個異常。後來Google搜到很多人遇到了這個故障,猜測是commons-collections.jar的問題,可能和MyEclipse 6.0.0自帶的包有問題導致。例如下面的是一個解決方案:

解決方案:
1)下載 MyEclipse 6.0.1 來開發;
2)或者去http://commons.apache.org/collections/ 下載一個新的包,把原來的commons-collections-xxx.jar給刪了,然後用新的包替換。注意:一定要到應用的釋出目錄去做這個工作,而且替換後不能重新發布應用,然後立即重啟Tomcat再測試。

--------------------------------------------------------------------------------------------------------

1、java.lang.NoSuchMethodError: org.springframework.util.ObjectUtils.nullSafeToString(Ljava/lang/Object;)Ljava/lang/String;
spring的jar包衝突錯誤:
我的是用的spring2.0的jar包,應為要用工作排程所以加了一個1.2版本的spring.jar做支援,專案跑在容器下跑沒事,單元測試就會出現以上錯誤。
參考資料:http://www.iteye.com/post/365364
2、
support.DisposableBeanAdapter (DisposableBeanAdapter.java:148) - Couldn't invoke destroy method of bean with name 'sessionFactory'
java.lang.IllegalStateException: Shutdown in progress
查了以下資料,也有人遇到過,找了一類似http://www.blogjava.net/allen-zhe/archive/2007/03/20/104880.html,我的解決方式,就在資料來源配置那加了一個destroy-method="close"配置就可以了。
解決方法是看了http://forum.springframework.org/archive/index.php/t-19665.html這片文章想出來的。
3、org.hibernate.HibernateException: CGLIB Enhancement failed:
原因是myeclipse6.0的cglib-2.1.3.jar有bug,改為cglib-2.1.jar就可以了
4、[這個是在伺服器執行時才報的,有點跑題了]還有一種比較隱蔽的錯誤,只要log4j屬性檔案設定為debug時才會報的錯誤程式碼如下:
DEBUG [main] xml.DefaultNamespaceHandlerResolver (DefaultNamespaceHandlerResolver.java:128) - Ignoring namespace handler [org.springframework.scripting.config.LangNamespaceHandler]: handler class not found
java.lang.ClassNotFoundException: org.springframework.scripting.config.LangNamespaceHandler
找不到類的提示,在google上搜了一段時間沒找到這個類在那個包裡,最後一想肯定myeclipse自帶的包肯定有,果然找到了,是少載入了spring-support.jar包。在myeclipse的Spring2.0 Misc Libraires庫裡

相關文章