2017-02-15 84 views
0

將以前的WebSphere EE應用程序移動到JBoss EAP 6.3時,在調用Castor 1.0組織的marshall(Object)方法時拋出了運行時異常。 exolab.castor.xml.Marshaller對象:JBoss EAP 6.3/Castor 1.0 - MappingException:找不到類

org.exolab.castor.mapping.MappingException: Nested error: org.exolab.castor.mapping.MappingException: Could not find the class {fully qualified Java class name}

(則Marshaller試圖序列化對象到XML)。

我看不出有什麼明顯的類路徑的問題。似乎沒有理由說明爲什麼使用JBoss Developer Studio進行編譯的這個應用程序在運行時會失敗。

問題發生在mapping.xml文件中描述的第一個Java類 - 不是與我試圖序列化的類,除非巧合它碰巧是mapping.xml文件中的第一個類。

什麼可能是問題,什麼是解決方案?

回答

0

淘谷歌後,我發現在這個話題的解決方案,從2002年:

https://developer.jboss.org/thread/21611

每弗雷德Loney在討論帖:

在JBoss的lib castor.jar駐留在一個類加載器,它是您的webapp類加載器的父類。 Castor依靠內省並嘗試使用其類加載器上下文來解析映射的類,而不是Web應用程序或線程上下文。因此找不到映射的應用程序類......默認情況下,Castor應該使用當前線程上下文類加載器,但它不會。對於依靠內省的其他開源中間件項目來說,這是一種常見的失敗,例如,仙人掌。

繼該線程建議的意見,我改變了我的代碼,而不是使用org.exolab.castor.mapping.Mapping的默認構造函數,而不是使用接受一個ClassLoader參數的構造,和我用我嘗試序列化的對象類的ClassLoader。

Object objectToSerialize = ... 

// I previously used Mapping's default constructor 
Mapping mapping = new Mapping(objectToSerialize.getClass().getClassLoader()); 
// Set other properties of mapping, such as entityResolver, mapping file, etc. 

StringWriter stringWriter = new StringWriter(); 
Marshaller marshaller = new Marshaller(stringWriter); 
marshaller.setMapping(mapping); 
marshaller.marshal(objectToSerialize); 

// stringWriter now contains the serialized data from objectToSerialize 

我希望弗雷德洛尼的小費可以幫助別人。我花了一段時間在網上找到問題和解決方案!