App 上传文件报错问题 JSONException

问题描述

最近多个项目反馈 App 上传文件保存时出现如下报错
image.png

问题重现

通过分析发现同时满足以下情况会出现该问题
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);