服务器端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

猜你喜欢

转载自blog.csdn.net/u011635351/article/details/10260741