1. 程式人生 > >伺服器端JSON開發中遇到的異常解析

伺服器端JSON開發中遇到的異常解析

    最近有很多朋友在做服務端JSON開發的時候遇到各種各樣的異常,尤其是NoClassDefFoundError異常屢改不絕,他們經過在工程裡面反覆查詢,沒有發現有任何相關的錯誤。於是我將我所遇到的一些最常見的異常列舉出來,方便大家及時的解決問題,節約時間。

1、我們在剛開始進行JSON開發的時候,必須匯入一個json-bin的jar包,如果不匯入這個包,我們經常使用的JSON,JSONObject,JSONArray,JSONSerializer等類將無法正常使用,工程裡面將找不到相應的類。我在此使用的是myeclipse,所以只需要將此包在放在lib資料夾下即可。

2、我們新建一個web工程,編寫好一段程式碼,例如:

編寫一個bean檔案Person.java,裡面包含三個欄位,int id,String name,string address。並重構其相關方法。

編寫一個JSONServer.java,並且在裡面新增如下一段程式碼:

	public static Person getPerson(){
		//在此我們構造一個person物件,並且返回給呼叫者。
		Person person = new Person(1, "amir", "chengdu");
		return person;
	}


編寫一個JSONTools.java,並且在裡面新增如下一段程式碼:

	public static String createJsonString(String key, Object value){
		//由於我們這個地方使用的是object,也就是說json處理的是物件,所以我們傳入的是一個person物件
		JSONObject object = new JSONObject();
		object.put(key, value);
		return object.toString();
	}

最後在main方法當中,我們做如下測試:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String msg = "";
		//測試獲取單個person
		Person p = JsonService.getPerson();
		msg = JSONTools.createJsonString("person", p);
		System.out.println(msg);
	}
此時我們的程式碼已經寫完,而且工程當中沒有任何錯誤,真所謂萬事俱備只欠東風了,於是我們執行一下看看會出現什麼情況?


Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(ClassLoader.java:621)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)

at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)

at java.net.URLClassLoader.access$000(URLClassLoader.java:56)

at java.net.URLClassLoader$1.run(URLClassLoader.java:195)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

at com.json.tools.JSONTools.createJsonString(JSONTools.java:17)

at com.json.test.TestJson.main(TestJson.java:20)

Caused by: java.lang.ClassNotFoundExceptionorg.apache.commons.lang.exception.NestableRuntimeException

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)


對,你猜對了,出現異常了。首先我們從第一行可以分析到java.lang.NoClassDefFoundError。這個是由於沒有相應類所引發的異常,也就是找不到類了。具體是找不到哪個類了呢,我們可以從這句話中看出:

Caused by: java.lang.ClassNotFoundExceptionorg.apache.commons.lang.exception.NestableRuntimeException

這句話說得特別明顯了,是由於org.apache.commons.lang.exception這個包下面的NestableRuntimeException這個類找不到了。

這時就需要我們匯入一個包:commons-lang-2.6.jar 

注意了,我使用的是commons-lang的第2.6個版本。現在最新的有一個叫做:commons-lang3-3.1.jar 

大家看清楚了,我們工程中所報的異常是由於org.apache.commons.lang這個包下面的,而在commons-lang3-3.1.jar 裡面的包名卻是這個樣子的org.apache.commons.lang3。其實我們從檔名上就可以看出,這個最新的是commons-lang3的第3.1個版本。


好了,匯入上面那個包後我們再執行一下看看又會出現什麼情況?

Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher

at com.json.tools.JSONTools.createJsonString(JSONTools.java:18)

at com.json.test.TestJson.main(TestJson.java:21)

Caused by: java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

... 2 more


沒錯,又出異常了,雖然還是因為找不到類而報的異常,但此時的異常有一些不一樣:

對,你肯定猜到了,還是由於少匯入了些包而引起的,這裡是由於缺少net.sf.ezmorph.Morpher這個類而引起的。

我們只需要下載如下包即可解決此問題:ezmorph-1.0.6.jar


來,我們繼續執行:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

at net.sf.json.AbstractJSON.<clinit>(AbstractJSON.java:53)

at com.json.tools.JSONTools.createJsonString(JSONTools.java:18)

at com.json.test.TestJson.main(TestJson.java:21)

Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

... 3 more


不用多說,會分析日誌的人都看得出來,這裡是由於缺少org.apache.commons.logging.LogFactory這個類而引起的。

我們只需要下載如下包即可解決此問題:commons-logging-1.1.3.jar


來,我們繼續執行:


Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections/map/ListOrderedMap

at net.sf.json.JSONObject.<init>(JSONObject.java:1450)

at com.json.tools.JSONTools.createJsonString(JSONTools.java:18)

at com.json.test.TestJson.main(TestJson.java:21)

Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.map.ListOrderedMap

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

... 3 more


這裡是由於缺少org.apache.commons.collections.map.ListOrderedMap這個類而引起的。

我們只需要下載如下包即可解決此問題:commons-collections-3.2.1-bin.zip

在這裡我們也需要注意不要匯入類似於這樣的包:commons-collections4-4.0-alpha1-bin.zip


來,我們繼續執行:


Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean

at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:230)

at net.sf.json.JSONObject._processValue(JSONObject.java:2655)

at net.sf.json.JSONObject.processValue(JSONObject.java:2721)

at net.sf.json.JSONObject.element(JSONObject.java:1786)

at net.sf.json.JSONObject.element(JSONObject.java:1764)

at net.sf.json.JSONObject.put(JSONObject.java:2380)

at com.json.tools.JSONTools.createJsonString(JSONTools.java:19)

at com.json.test.TestJson.main(TestJson.java:21)

Caused by: java.lang.ClassNotFoundException: org.apache.commons.beanutils.DynaBean

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

... 8 more


這裡是由於缺少org.apache.commons.beanutils.DynaBean這個類而引起的。

我們只需要下載如下包即可解決此問題:來,我們繼續執行:commons-beanutils-1.8.3.jar


來,我們繼續執行後控制檯打印出瞭如下一段字串:

{"person":{"address":"chengdu","id":1,"name":"amir"}}


從以上我們可以看出,在我們進行伺服器端JSON開發的時候,我們需要用到額外的.jar包有:

ezmorph-1.0.6.jar 

commons-logging-1.1.3.jar 

commons-lang-2.6.jar

commons-beanutils-1.8.3.jar

commons-collections-3.2.1.jar

 json-lib-2.4-jdk15.jar

從上面的日誌當中我們可以總結出一些結論:

1、就是我們在做開發的時候,信所遇到的異常資訊當中,已經將我們需要的東西全都告訴給我們了,我們只需要根據日誌,仔細的分析即可解決問題。

2、從日誌中我們可以分析出我們找不到的類是在org.apache這個開源專案下,而我們所使用的開發語言java是不包含這一塊的,所以我們可以大膽的猜想這是由於缺少某個apache的外掛或者引用包而導致的。

3、就以上面貼出的這麼多個異常資訊(org.apache.commons.beanutils.DynaBean),我們可以看出所報的異常當中,最後一個是類名,前面是包名,而根據我們所下載的這麼多jar檔案,使用其包名中的關鍵字commons、beanutils即可在瀏覽器中搜索出以對應關鍵字命名的.jar包。


以上是小弟的一些想法,讀者如有更好的方法或者意見,請與我交流,謝謝。


作者:Amir

部落格:http://blog.csdn.net/amir_zt/

以上原創,轉載請註明出處,謝謝。

http://blog.csdn.net/amir_zt/article/details/10260741