Struts2 备忘

今天帮两个同事各看了一个问题,有点意思。

Struts2 JSON 序列化与 Action get 方法

场景:同事跑来说他的ajax请求总是进入ajax的错误处理的回调函数,他需要用ajax提交请求到action,然后处理返回结果。

异常现象:这个同事也没什么经验,他告诉我的是ajax请求总是进入ajax的错误处理的回调函数,我在chrome开发工具那里一看,http响应是500,肯定进入错误处理的回调函数了,所以问题应该是在服务端。

分析与解决:在eclipse里debug跟踪发现action执行是ok的,返回的结果名也是 SUCCESS,配置也没问题,但控制返回给Struts2框架后却抛出一堆异常,异常信息跟请求完全无关,从异常栈来看,抛出异常的方法也没有在请求方法里调用,虽然它们都在同一个action里,异常栈的方法基本都是JSON序列化有关的方法的,也就是说问题应该是出在Struts2框架在把action结果序列化为JSON返回给浏览器之前。一开始也看不出具体问题,后来同事在网上搜索看到说是 setter/getter 导致的,然后他的那个被抛出异常的方法也是以get开头命名的,坑就这么形成了:Struts2在序列化action的结果时,会把action的所有公开的getter方法的结果序列化到json里,那个方法以get开头,自然也就被调用了,然后异常就抛出来了。

这个问题自己写的时候一般都会注意避开,但不小心的人还是会踩上的。

ajax 提交 JS 数组对象与 Struts2 参数解析

场景:在页面输入一组用户信息,然后用jQuery的ajax提交给后台的Struts2 action,在JS里,这组信息是用数组来存储,数组的每个元素是一个JSON对象。

异常现象:在tomcat的控制台输出的异常信息是这样的:No result defined for action package4.business.action and result input

分析与解决:一开始我也以为是Java代码的问题,毕竟异常是在控制台里抛出的,但代码也看不出什么问题。这个请求的url在浏览器地址栏直接打开是没有问题的,所以我想,是不是跟请求方法有关,改为 GET 后还是出错。再想,地址栏打开是不带数据的,so在ajax里也不带数据,结果也没异常了,所以可以确定是请求参数的问题了。在chrome的开发工具那里看到,数组参数都被序列化为 persons[0][name]=name 的形式发出去了,这在js里是没问题的,访问对象的属性可以用句点(json.prop),也可以用方括号(json[prop]),参数被提交到Struts2时,它进行参数解析并映射到Java对象,它的规则却与这个有冲突了,对于句点,Struts2也是解析为对象的属性,但方括号却是被当作数组的,所以解析肯定失败,会抛出异常,捕获到参数解析异常后,请求会被路由到命名为 input 的结果那里,但我们这个项目都没配置 input,所以抛出的异常是找不到 result input

Struts2 备忘》上有2条评论

  1. 这篇文章对我有点帮助,谢谢了。
    我遇到的问题是,我想让struts返回json到前端,如果struts的action不出现异常的话,前端是可以获取到json数据的,当出现异常的时候,在前端打印出来的是异常信息,即使将dev.mode改为false还是一样的结果。

    • 你说的跟dev.mode没关系啊。出现异常时程序必须处理啊,要不然就会被抛出到容器,然后容器就把异常信息返回了。异常处理代码可以catch住异常,然后把错误信息封装成json返回,前端也要检查你的http调用是否成功。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.