事件起因

昨天提测修改冻结/解冻银行卡样式的功能,微姐测试过程中发现调用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()执行两次的过程如下:

  1. 后端struts框架接收到浏览器发送的请求,找到配置对应的action,将请求交给action对应的method来处理
  2. 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格式数据踩坑记录的更多相关文章

  1. Struts2 返回 json 格式数据

    最近由于工作原因,没时间更新,那些没能看到的同学,很抱歉了,话不多说,继续写~~ 关于json的返回需要用到一个工具包来将书转换为json格式,在此用到的jar包为: import net.sf.js ...

  2. 使用jQuery发送POST,Ajax请求返回JSON格式数据

    问题: 使用jQuery POST提交数据到PHP文件, PHP返回的json_encode后的数组数据,但jQuery接收到的数据不能解析为JSON对象,而是字符串{"code" ...

  3. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  4. 返回json格式数据乱码

    本文为博主原创,未经允许不得转载: 原本返回json格式数据的代码: @ResponseBody @RequestMapping(value = "getListByTime", ...

  5. WebService返回json格式数据供苹果或者安卓程序调用

    1.新建一个WebService. 2. /// <summary> /// DemoToJson 的摘要说明 /// </summary> [WebService(Names ...

  6. Django 1.8.11 查询数据库返回JSON格式数据

    Django 1.8.11 查询数据库返回JSON格式数据 和前端交互全部使用JSON,如何将数据库查询结果转换成JSON格式 环境 Win10 Python2.7 Django 1.8.11 返回多 ...

  7. ajax请求后台,返回json格式数据,模板!

    添加一个用户的时候,需要找出公司下所有的部门,和相应部门下的角色,利用ajax请求,实现联动技术.将返回的json格式数据,添加到select标签下. <script type="te ...

  8. 如何让webapi只返回json格式数据

    最近脑子不好用,总记不住事,以前搞过让webapi只返回json格式的数据,今天有人问我又突然想不起了,后来总结一下,备忘一下,大概有下面几种处理方式 1.在WebApiConfig类的Registe ...

  9. springmvc通过ajax异步请求返回json格式数据

    jsp 首先创建index.jsp页面 <script type="text/javascript"> $(function () { $("#usernam ...

随机推荐

  1. ASP.NET MVC 5 03 - 安装MVC5并创建第一个应用程序

    不知不觉 又逢年底, 穷的钞票 所剩无几. 朋友圈里 各种装逼, 抹抹眼泪 MVC 继续走起.. 本系列纯属学习笔记,如果哪里有错误或遗漏的地方,希望大家高调指出,当然,我肯定不会低调改正的.(开个小 ...

  2. 用ORM的思想操作XML文档,一个对象就搞定不要太简单。滚蛋吧!XmlDocument、XmlNode、Xml***……

    大家有没有这样的感受,一涉及XML文档操作就得百度一遍.是不是非!常!烦!.各种类型,各种方法,更别提为了找到一个节点多费劲.本来想写个XML操作的工具方法,写了两行一想既然XML文档是有规律的,如果 ...

  3. Linux下安装jdk1.7、Apache-tomcat7

    首先说明下我的主机环境:主机:32位win7 虚拟机:VMware Workstation10.0.1 linux:红帽子centos6.4 jdk1.7 Apache-tomcat7 java环境需 ...

  4. java实现单链表的整表创建

    package com.java.dataStruct; public class Node<E> { E item; Node next; public Node(){ } public ...

  5. 【转】BAT 批处理脚本 教程

    第一章 批处理基础第一节 常用批处理内部命令简介批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令.小知识:可以在 ...

  6. C#调用天气查询服务

    先引入天气查询服务 1.有点引用导入服务引用 //实例化            web引用名.WeatherWebService cn = new web引用名.WeatherWebService() ...

  7. [LeetCode] Sqrt(x) 求平方根

    Implement int sqrt(int x). Compute and return the square root of x. 这道题要求我们求平方根,我们能想到的方法就是算一个候选值的平方, ...

  8. C#调用vbs脚本实现Windows版Siri

    最近新加入,把自己一些有意思的小东西分享给大家,我是一个学生,代码写得少,哪里不规范,希望大家见谅. 这事我封装好的一个类,可以直接实例化对象之后,调用"对象.Talk()"方法, ...

  9. python基础-软件目录结构规范

    一.定义目录结构目的 可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快速的了解这个项目. 可维护性高: 定义好组织规则 ...

  10. weui tabbar 切换

    Html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <met ...