App 上传文件报错问题 JSONException
问题描述
最近多个项目反馈 App 上传文件保存时出现如下报错
问题重现
通过分析发现同时满足以下情况会出现该问题
1. 上传文件,并且通过List<FileUploadData> files = this.getFileUploadService().getProcessData(this.pageData);
获取文件
2.Controller 在 applicationContext-security.xml 中配置了跳过登陆拦截
3.Controller 中同时做了新建实体并保存至数据库的操作
4. 请求中传入了loginName
参数
问题分析
由于跳过了登陆拦截ConstantUtil.getCurrentUserName()
无法获取到用户名,在 Controller 中获取文件,并且传入了loginName
时,平台会根据loginName
查询出用户工厂信息,并且将信息放入线程名中,如果有实体保存,在保存之前平台会给实体设置工厂信息等,根据线程名前缀,平台将从线程名中获取信息,由于wcGid
中存在字符-
,截取到错误信息,导致 Json 转换失败,抛出 JSONException
解决方案
方案一:在 Pom 中加入基于 5.1.3 平台制作的补丁
<dependency>
<groupId>com.epichust</groupId>
<artifactId>above-patch-5.1.3</artifactId>
<version>20220708-appUpload</version>
</dependency>
方案二:不使用参数loginName
,或使用其他名字替代
方案三:记录线程名,平台修改完线程后,再改回去
String threadName = Thread.currentThread().getName();
List<FileUploadData> files = this.getFileUploadService().getProcessData(this.pageData);
Thread.currentThread().setName(threadName);