行业网站建设费用明细网站建设介绍会发言稿
news/
2025/10/4 6:09:47/
文章来源:
行业网站建设费用明细,网站建设介绍会发言稿,做网站的免费空间,注册公司3个人分别是啥问题回溯
2023年Q2某日运营反馈一个问题#xff0c;商品系统商家中心某批量工具模板无法下载#xff0c;导致功能无法使用#xff08;因为模板是动态变化的#xff09;
商家中心报错#xff08;JSON串#xff09;#xff1a;
{code:-1,msg:商品系统商家中心某批量工具模板无法下载导致功能无法使用因为模板是动态变化的
商家中心报错JSON串
{code:-1,msg:失败}负责的同事看到失败后立即与我展开讨论因为不是关键业务所以不需要回滚修复即可我们发现新功能模板下载的代码与之前的代码有所不同恰好之前的功能又可以正常运行所以同事对现有代码进行改造然后预发布测试完成后再次上线。
其他业务代码
/*** 模板下载*/
RequestMapping(/doBatchWareSetAd)
public void doBatchWareSetAd(RequestParam MultipartFile file, HttpServletResponse response) {wareBatchBusiness.doBatchWareSetAd(file, response, getLongOrgCode(), getCurrentUserPin(), getCurrentUserId());
}问题业务代码
/*** 模板下载*/
RequestMapping(/doBatchWareSetAdDemo)
ResponseBody
public MapString, Object doBatchWareSetAd(RequestParam MultipartFile file, HttpServletResponse response) {return wareBatchBusiness.doBatchWareSetAd(file, response, getLongOrgCode(), getCurrentUserPin(), getCurrentUserId());
}上线的结果是仍然无法使用。
其实也正常因为两种代码在预发布都可以正常运行在线上出错只可能是因为其他原因只不过我们不了解底层原理害怕它 “可能” 有问题罢了最终查询得到的结论是权限系统管理员在线上环境没有给我们配置相应的文件导致请求为空导致请求失败。
探索 ResponseBody 与主动写入流的关系
我们都知道 ResponseBody 注解可以帮助我们把返回对象转化为JSON方便展示和交互。
那它到底是如何工作的呢请看下面的讲解
代码案例1
RequestMapping(/test1)
ResponseBody
public MapString, String test1(HttpServletResponse response) {MapString, String map new HashMap();map.put(1, 1);return map;
}// 响应
JSON报文跟代码发现其核心处理类为RequestResponseBodyMethodProcessor.java
方法org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor#handleReturnValue 会处理其相关返回值。
真正的核心处理方法org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor#writeWithMessageConverters
关键DEBUG记录如图所示 后续内容可以想象肯定还有地方去把流按照指定的HEADER写入因为和本文无关所以不深究。
再来看代码案例2
RequestMapping(/test2)
ResponseBody
public MapString, String test2(HttpServletResponse response) throws IOException {MapString, String map new HashMap();map.put(1, 1);response.setContentType(application/vnd.ms-excel);response.setHeader(Content-Disposition, String.format(attachment; filename%s_%s.xls, Demo, System.currentTimeMillis()));OutputStream out response.getOutputStream();out.flush();out.close();return map;
}// 响应
提示下载文件关键DEBUG源码截图 可以发现Spring对这种方式操作文件流视作异常情况然后抛出在后续逻辑中完成整个请求简单来说就是 ResponseBody 注解没起到任何作用。
因此答案呼之欲出当时功能不可用的罪魁祸首就是相关人员没有配置参数导致与写法没有任何关系。
结论与启发
结论
我们要相信自己的代码至少是要相信已经经过测试的代码。在委托他人或者自己配置环境参数如权限、ZK等每次都保证预发布和线上同时配置避免遗漏的情况。
启发
聊了这么多那我们这种类似场景的代码应该怎么写
既然主动写入流会解除ResponseBody的作用反之又能发挥它的作用那我们最佳方案是不是如下所示
RequestMapping(/test1)
ResponseBody
public MapString, String test1(HttpServletResponse response) {MapString, String map new HashMap();if (获取不到文件配置 true) {return map.put(msg, 获取不到文件配置);}response.setContentType(application/vnd.ms-excel);response.setHeader(Content-Disposition, String.format(attachment; filename%s_%s.xls, Demo, System.currentTimeMillis()));OutputStream out response.getOutputStream();out.flush();out.close();return map;
}如此一来当发生预期之外的情况我们有非常明显的报错提示当正常时又可以完美实现功能妙哉我觉得~ 作者京东零售 柯贤铭 来源京东云开发者社区 转载请注明来源
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926642.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!