这次的项目中,一个同事遇到了一个奇怪的问题。背景是这样的,项目中使用了struts2+spring,在前端有一个功能实现是使用JQuery的ajax请求访问一个struts2的action,要求返回的是view是json。其中项目加入了如下本问题相关的jar包:struts2-core-2.1.8.1.jar,struts2-json-plugin-2.2.1.jar,json-lib-2.4-jdk15.jar。具体的代码与配置都没有问题,即使用了标准的相关写法,因为不涉及到这个问题的讨论,所以就不贴代码了。因为当时帮他调试的时候没有记录具体的异常,我在网上找到了相关的问题贴,转载如下:
http://hi.baidu.com/%BF%AA%CB%B3/blog/item/c06cbf451d530b8cb3b7dc4c.html
异常形式:
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到客户端。有的时候,很多属性并不能串行化成json数据,比如这里的oracle.jdbc.driver.BaseResultSet。这时还进行强行转换就会出现这样的异常。
解决方法:
在不能串行化到json的属性相应的get方法前加一条json标记@JSON(serialize=false)。告诉json不需要转化这个属性。或者根本不写这个get方法。
后记:
对于不需要在前台输出的json数据,也可以用同样的方法进行处理,从而减少服务器和客户端间交互的信息量。
可在需要在前台输出的属性的get方法前加上@JSON(name="status")标识,从而为该属性起了一个别名,在前台就可以通过status作为属性名来读取其值。
由此可见是因为序列化问题造成的,反思我们项目中的问题,原因是因为在action中注入service时使用的是接口(网上的另一种说法是在action中的接口不能给予get方法,但是那只是描述了现象,如果上文所述正确的话那从本质上说明了原因),而且提供了get方法,接口不能被串行化。去掉get方法后,异常消失。先在此记录下,有空了看下相关的源代码,拿源码说事更有说服力....
分享到:
相关推荐
1、将struts2的json插件加入web工程的lib,jsonplugin的下载地址:http://code.google.com/p/jsonplugin/downloads/list
struts2-json-plugin,Struts JSON插件
struts2整合json的插件struts2-json-plugin源码,不是jar包
注:struts2的json插件有两个版本0.32和0.34,我用的struts2的版本是2.0.11,在加入0.34版本json插件时启动发生异常,提示找不到相关方法,后来就换成了低版本的0.32一切OK,仔细查看文档后发现struts2的2.0.*版本的...
struts2的json插件实例
两个版本的插件,找了很久的哦!需要的速度下载!
json+struts2+hibernate+spring jar 插件 web 开发 必备
Struts2+JQuery+Json及JQuery相关插件的例子(好),json架包,JSON简介,JSON入门指南,JSON入门教程,java解析JSON
这可以实现struts和json的整合 <struts> <package name="demo" extends="json-default"> <result type="json"/> </action> </struts>
Struts 2并没有开发新的AJAX框架,而是使用时下Java EE平台中比较流行的AJAX框架——Dojo...最近在Musachy Barroso等同志的无私奉献下,开发了Struts 2的JSON插件(Plugin),极大地方便了我们输出JSON结果(Result)。
2.Action里通过struts2-spring-plugin.jar插件自动根据名字注入。 3.Ajax无刷新异步调用Struts2,返回Json数据,以用户注册为例。 4.在服务端分页查询功能,优点:实时性:跳页才查询。数据量小:只加载当前页的记录...
JsonUtils.java 源代码. 博文链接:https://flym.iteye.com/blog/183562
java相关的Struts2-Json插件的使用例子.pdfjava相关的Struts2-Json插件的使用例子.pdf
struts 2.0 与 2.1 对应需要的json插件
http://blog.csdn.net/gxy1317/article/details/52409360
myeclipse8下STRUTS(自带JSON插件)的JSON传值例子.解决包冲突问题,不用下载GOOGLE插件
struts插件,放入classpath中即用!
struts2利用插件struts2-json-plugin-2.1.8.jar实现json支持