Struts2返回json格式数据踩坑记录
事件起因
昨天提测修改冻结/解冻银行卡样式的功能,微姐测试过程中发现调用ajax请求耗时过长,今天来排查,发现浏览器请求/finance/ajax/freeze/ajaxGetShopLists时,对应的后端方法getShopList()莫名其妙地执行了两边,并且返回给浏览器的Json字符串如下:
{
"accountId": null,
"accountInfoBean": {
"accountId": null,
"accountName": null,
"balance": null,
"bankAccountEffective": 0,
"bankAccountName": null,
"bankName": null,
"bankNumber": null,
"canWithDraw": null,
"canWithDrawNow": null,
"canWithdrawAmount": null,
"frozenReason": null,
"hadTransferTxToday": false,
"nextSettleDate": null,
"settleType": 0,
"status": 0,
"withDrawNowLimitBySubAccount": null,
"withdrawRuleString": null
},
"admin": false,
"code": 200,
"customerId": 401**976,
"customerList": null,
"customerName": "肖*",
"message": null,
"mobile": "1301***5995",
"msg": {
"customerName": "肖**",
"currentShopId": 0,
"accountId": null,
"shopList": [
{
"accountId": "210*******021",
"customerId": 0,
"displayName": "公司账户",
"shopId": 0,
"statusMessage": ""
}
],
"code": 200,
"mobile": "130****5995"
},
"productCode": 1,
"selectedShopName": "",
"shopAccountBeanList": [
{
"accountId": "2100*****021",
"customerId": 0,
"displayName": "公司账户",
"shopId": 0
}
],
"shopId": 0,
"shopList": "success",
"shopListJson": "[]"
}
而对应的方法如下:
public String getShopList() {
if (flag) {
loginAccountProfile = getLoginAccountProfile();
//初始化门店信息
code = SUCCESS_CODE;
initShopInfo();
getAccountIdStatus(shopAccountBeanList);
//获取客户名以及电话
getCustomerNameAndMobile();
msg.put("shopList", shopList);
msg.put("currentShopId", currentShopId);
msg.put("accountId", accountId);
msg.put("mobile", dealWithMobileNo(mobile));
msg.put("customerName", customerName);
msg.put("code", code);
flag = false;
}else{
logger.info("-------flag is false");
}
return SUCCESS;
}
对应的Struts配置如下
<package name="freezeAjax" namespace="/finance/ajax/freeze" extends="union-bill">
<action name="ajaxGetShopLists"
class="com.*****.AjaxGetShopList" method="getShopList">
<result type="json" name="success"></result>
</action>
</package>
从上面返回的Json字符串内容来看,返回字段并不是getShopList()方法中指定的字段,而是包含了com.*****.AjaxGetShopList类中所有get方法对应的字段。
初步推测getShopList()执行两次的过程如下:
- 后端struts框架接收到浏览器发送的请求,找到配置对应的action,将请求交给action对应的method来处理
- action对应的method处理完成后,根据xml中配置的内容返回结果给浏览器。网上搜索struts返回json的配置格式如下
<action name="jsonAction" class="com.ljq.action.JsonAction">
<result type="json">
<!-- 此处将reslut的值返回给客户端,root的值对应要返回的值的属性result
注意:root为固定写法,否则不会把result的值返回给客户端 -->
<param name="root">result</param>
</result>
</action>
所以推测是由于xml配置有问题,导致返回结果给浏览器时,将com.*****.AjaxGetShopList类中所有的get方法都执行了一遍。
尝试修改
将struts配置文件修改如下
<package name="freezeAjax" namespace="/finance/ajax/freeze" extends="union-bill">
<action name="ajaxGetShopLists"
class="com.*****.AjaxGetShopList" method="getShopList">
<!--
<result type="json"></result>
-->
<result type="json">
<param name="root">msg</param>
</result>
</action>
</package>
此时getShopList()方法只被调用一次,返回给浏览器的json格式如下:
{
"customerName": "饶总",
"currentShopId": 0,
"accountId": null,
"shopList": [
{
"accountId": "2100*****214",
"customerId": 0,
"displayName": "公司账户",
"freezeStatus": 0,
"shopId": 0,
"statusMessage": ""
}
],
"code": 200,
"mobile": "183****5421"
}
推测成立。在AjaxGetShopList类中增加一个getTestString()方法,使用之前错误的配置方式,无论AjaxGetShopList类中存不存在testString字段,返回给浏览器的json字符串中会多一个testString字段。
Struts2返回json格式数据踩坑记录的更多相关文章
- Struts2 返回 json 格式数据
最近由于工作原因,没时间更新,那些没能看到的同学,很抱歉了,话不多说,继续写~~ 关于json的返回需要用到一个工具包来将书转换为json格式,在此用到的jar包为: import net.sf.js ...
- 使用jQuery发送POST,Ajax请求返回JSON格式数据
问题: 使用jQuery POST提交数据到PHP文件, PHP返回的json_encode后的数组数据,但jQuery接收到的数据不能解析为JSON对象,而是字符串{"code" ...
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
- 返回json格式数据乱码
本文为博主原创,未经允许不得转载: 原本返回json格式数据的代码: @ResponseBody @RequestMapping(value = "getListByTime", ...
- WebService返回json格式数据供苹果或者安卓程序调用
1.新建一个WebService. 2. /// <summary> /// DemoToJson 的摘要说明 /// </summary> [WebService(Names ...
- Django 1.8.11 查询数据库返回JSON格式数据
Django 1.8.11 查询数据库返回JSON格式数据 和前端交互全部使用JSON,如何将数据库查询结果转换成JSON格式 环境 Win10 Python2.7 Django 1.8.11 返回多 ...
- ajax请求后台,返回json格式数据,模板!
添加一个用户的时候,需要找出公司下所有的部门,和相应部门下的角色,利用ajax请求,实现联动技术.将返回的json格式数据,添加到select标签下. <script type="te ...
- 如何让webapi只返回json格式数据
最近脑子不好用,总记不住事,以前搞过让webapi只返回json格式的数据,今天有人问我又突然想不起了,后来总结一下,备忘一下,大概有下面几种处理方式 1.在WebApiConfig类的Registe ...
- springmvc通过ajax异步请求返回json格式数据
jsp 首先创建index.jsp页面 <script type="text/javascript"> $(function () { $("#usernam ...
随机推荐
- 终于将rsync-3.1.2配置成功,之外还挖掘了一些新的用法
1.为什么要用rsync: 有两台主机,开始准备做HA,考虑到工作量的问题,最终决定将重要文件进行同步即可. 找了一些同步的工具,rsync得到一致好评,速度快,消耗小等等. 2.接着找资料,最后选用 ...
- Hadoop技巧(02):时间同步
阅读目录 序 时间同步 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 在实际部署 ...
- OutPut子句的使用限制
Output子句很方便,多数情况下可以省略了更新后插入或者删除后插入操作表,将2个语句变成1个语句操作.不管从语句美观还是效率上都是有不错的提升, 但是对于Output自身,也是有一些限制的. 从文档 ...
- 【msql】关于redo 和 undo log
InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性.和大多数关系型数据库一样,Inno ...
- My first win32 application program
#include<afxwin.h>#include<afx.h>#define _AFXDLLclass CHelloApp :public CWinApp{public: ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Boolean()值为false的五个特殊值
在if.while等需要判断条件时,会调用函数Boolean()对判断条件进行隐式转换,而只有五个特殊值才会返回false 这五个值是:undefined, null, "", 0 ...
- bootstrap自学总结不间断更新
2.栅格系统 container-fluid 自适应宽度100% container 固定宽度(适应响应式) 屏幕宽度=x x>=1200 1170 992< ...
- CentOS 6.5 升级 PHP 到5.6
1. 首先先看下已安装的版本: yum list installed | grep php 可以看到我的都是5.3的 php.x86_64 -.el6_8 @updates php-cli.x86_6 ...
- UVA10304
全部遍历.设置两个下标,若相同i++,j++,不相同则j++. #include<stdio.h> #include<string.h> int main(){ ]; ]; s ...