事件起因

昨天提测修改冻结/解冻银行卡样式的功能,微姐测试过程中发现调用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. SQL Server 2014 Database Mail重复发送邮件特殊案例

    在一数据库服务器(Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64))发现有个作业调用Database Mail发送邮件时, ...

  2. SQLite使用(二)&&数据类型

    1.概述 我们熟知的数据库引擎大部分采用静态数据类型,即列定义的类型定义了值的存储,并且值要严格满足列的定义,同一列所有值的存储方式都相同,比如定义了一个列类型为整型 int,不能在该列上输入'abc ...

  3. SQL Server数据库性能优化技巧

    查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引: 2.I/O吞吐量小,形成了瓶颈效应: 3.内存不足: 4.网络速度慢: 5.查询出的数据量过大: 6.锁或者死锁: 7.返回了不必 ...

  4. Jmeter添加硬件监控

    首先非常感谢介绍jmeter的博主,多谢您. 看了之后受益匪浅啊~~ 根据这篇博文的说法,首先进入网站 点击Jmeter-plugins.org 点击downloads 这两个都可以下载,反正都一样. ...

  5. 理解Docker(4):Docker 容器使用 cgroups 限制资源使用

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  6. JS-- 浮点数运算处理

        一. 问题描述 最近在做一个项目,页面上会存在一些JS浮点数的运算,发现JS浮点数运算存在一些bug.譬如: 0.1+0.2 == 0.30000000000000004 0.1 + 0.7 ...

  7. C Primer Plus 学习体会

    本月刚刚开始学习<C primer plus>,之前课上草草学过一遍,讲到指针就结束了.现在重新开始看感觉难度不大只是刚开始接触有些语言细节比较琐碎.学习这一周的体会如下: 诸多前辈推荐的 ...

  8. [LeetCode] Plus One 加一运算

    Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...

  9. 【教程】CDQ套CDQ——四维偏序问题

    前言 上一篇文章已经介绍了简单的CDQ分治,包括经典的二维偏序和三维偏序问题,还有带修改和查询的二维/三维偏序问题.本文讲介绍多重CDQ分治的嵌套,即多维偏序问题. 四维偏序问题       给定N( ...

  10. Go语言常用命令介绍

    go build go build 命令主要是用于测试编译.在包的编译过程中,若有必要,会同时编译与之相关联的包. 如果是普通包,当你执行go build命令后,不会产生任何文件. 如果是main包, ...