org.apache.struts2.json.JSONWriter can not access a member of class org.apache.commons.dbcp...
之前在用ssh整合json时一直发现前台获取不到json的返回数据。直接执行action出现下面错误:
HTTP Status 500 - org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: java.lang.IllegalAccessException: Class org.apache.struts2.json.JSONWriter can not access a member of class org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper with modifiers "public"
主要原因:struts会将action中定义的一些变量序列化转换成json格式。须要调用对象的一系列get方法(样例中调用UserDAO的get方法),并调用以上变量的成员变量的get方法将其内容组成json格式。可是在序列化authorityService时,因为其成员变量中含有含有接口所以会报错。
最后參考网上的解决的方法攻克了,可是过程中发现网上的一些说法有问题。
http://blog.csdn.net/xtra6714/article/details/5721593
这位仁兄说方法返回接口类型时会出现这种错误,要去掉action中相关返回接口类型的get方法,可是我的action中没有直接返回接口类型的方法啊!
http://hi.baidu.com/whosimplylol/item/bd93329d20884ccbb625315f
这篇文章中的解释例如以下:
异常形式:
Class org.apache.struts2.json.JSONWriter can not access a member of * 或是 Class com.googlecode.jsonplugin.JSONWriter can not access a member of class*
第一种是struct2.1.8与json结合时的异常,另外一种是struct2.1.6与json结合的异常。
详细:
Class org.apache.struts2.json.JSONWriter can not access a member of class oracle.jdbc.driver.BaseResultSet with modifiers "public"
解释:
不能把程序中的某种数据结构串行化成json格式。
原因:
struts2的action里面的数据转换成json数据时。会将提供了get方法的属性都串行化输出JSON到client。有的时候,非常多属性并不能串行化成json数据,比方这里的oracle.jdbc.driver.BaseResultSet。这时还进行强行转换就会出现这种异常。
解决方法:
在不能串行化到json的属性对应的get方法前加一条json标记 @JSON(serialize=false)。告诉json不须要转化这个属性。
或者根本不写这个get方法。
后记:
对于不须要在前台输出的json数据,也能够用相同的方法进行处理,从而降低server和client间交互的信息量。
可在须要在前台输出的属性的get方法前加上@JSON(name="status")标识。从而为该属性起了一个别名,在前台就能够通过status作为属性名来读取其值。
http://www.cnblogs.com/xiaoyaorensheng/archive/2013/01/02/2842302.html这个文章里解释的还是比較令人惬意的。调用的UserDAO的成员变量里有返回接口的get方法。所以无法返回json数据。
posted on 2019-05-14 17:22 xfgnongmin 阅读(134) 评论(0) 编辑 收藏 举报