struts2 + Json插件出现的一个问题

本文详细阐述了在使用Struts2+Spring框架时,遇到的关于JSON插件与JQuery AJAX请求相结合的问题。主要讨论了如何在特定情况下避免将无法序列化的数据类型(如oracle.jdbc.driver.BaseResultSet)输出为JSON格式,以及如何通过在相关属性的get方法前添加注解来解决此问题。同时,还强调了对于不需要在前端展示的json数据,可以通过相同的方法进行处理,以减少服务器与客户端间的交互信息量。
      这次的项目中,一个同事遇到了一个奇怪的问题。背景是这样的,项目中使用了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方法后,异常消失。先在此记录下,有空了看下相关的源代码,拿源码说事更有说服力.... 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值