设为首页 收藏本站
查看: 815|回复: 0

[经验分享] org.apache.struts2.json.JSONException: java.lang.IllegalAccessException

[复制链接]

尚未签到

发表于 2017-12-25 07:33:22 | 显示全部楼层 |阅读模式
  一、问题描述
  今天进行一个订单管理模块的开发时遇到一个问题:查询的订单时有时会报这个异常:
  org.apache.struts2.json.JSONException: java.lang.IllegalAccessException:

  Class org.apache.struts2.json.JSONWriter can not access a member of>  经过反复测试,发现只要查询结果中的downloadurl这个字段有值就会报错,这在Oracle中是一个Clob字段,里面保存的是一个文件地址的URL。
  二、解决过程
  网上找资料说是Struts2中Action的属性json序列化的问题,有个博客写的比较清楚,摘录如下:
  异常形式:

  Class org.apache.struts2.json.JSONWriter can not access a member of * 或是>  第一种是struct2.1.8与json结合时的异常,第二种是struct2.1.6与json结合的异常。
  具体:

  Class org.apache.struts2.json.JSONWriter can not access a member of>  解释:
  不能把程序中的某种数据结构串行化成json格式。
  原因:
  struts2的Action里面的数据转换成json数据时,会将提供了get方法的Action属性都串行化为json输出到客户端。有的时候,很多属性并不能串行化成json数据,比如这里的oracle.jdbc.driver.BaseResultSet。这时还进行强行转换就会出现这样的异常。
  解决方法:
  在不能串行化到json的Action属性相应的get方法前加一条json标记 @JSON(serialize=false)。告诉json不需要转化这个属性。或者根本不写这个get方法。
  总结:
  对于不需要在前台输出的json数据,也可以用同样的方法进行处理,从而减少服务器和客户端间交互的信息量。
  可在需要在前台输出的Action属性的get方法前加上@JSON(name="status")标识,从而为该属性起了一个别名,在前台就可以通过status作为属性名来读取其值。
  三、问题处理
  这是我Action的配置,没有问题:
  

    <package name="ajax" namespace="/ajax" extends="json-default">  <action name="*_*" method="{2}">
  <result type="json" name="success">
  <param name="root">result</param>
  </result>
  </action>
  </package>
  

  我这也是这种类型问题,将查询出来的结果put进Action的属性result,然后result在转json的时候报错了,原因就是result中保存的查询结果中的Clob类型的downloadurl无法进行串行化为json。
  把查询结果中的downloadurl这个字段进行类型转换成String,(对url编码是防止转换成json的时候url数据丢失的问题),主要代码修改如下:
  

       List<Map<String,Object>> list = orderService.selectFactoryOrders(map);//查询结果  

             for (Map<String, Object> map2 : list) {  

                 if (map2.get("DOWNLOADURL") != null) {  

                     System.out.println(map2.get("DOWNLOADURL"));  

                     //将Clob转化成String  
                     Clob clob = (Clob)map2.get("DOWNLOADURL");
  
                     String desc = null;
  
                     Reader inStream = clob.getCharacterStream();
  
                     long length = (clob == null) ? 0 : clob.length();
  
                     char[] c = new char[(int) length];
  
                     try {
  
                         inStream.read(c);
  
                         desc = new String(c);
  
                         inStream.close();
  
                     } catch (IOException e1) {
  
                         e1.printStackTrace();
  
                     }
  
                     
  
                     System.out.println(desc);
  
                     //对String类型的URL进行编码,前台进行相应解码
  
                     map2.put("DOWNLOADURL", URLEncoder.encode(desc,"utf-8"));
  
                 }
  
             }
  
             result.put("status", "success");
  
             result.put("data", list);
  
             result.put("pageTotal", pageTotal);
  

  问题解决。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-427702-1-1.html 上篇帖子: Flask + mod_wsgi + Apache on Windows 部署成功(随时接受提问) 下篇帖子: java.lang.ClassNotFoundException: org.apache.commons.collections.FastHashMap
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表