• 一行日志,让整个文件导出服务导出内容都为空..


    输出一行日志,却让整个文件上传服务挂了...

    问题

    直接上代码,看看有无眼尖的小伙伴发现问题:

    // 设置参数
    MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
    FileSystemResource resource = new FileSystemResource(file);
    param.set("token", "XXXXXX");
    param.set("file", resource);
    LOGGER.info("开始文件上传: {}", JSONObject.toJSONString(param));
    httpsRestTemplate.postForObject(uploadParam.getUrl(), param, HashMap.class);
    LOGGER.info("文件上传结束");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    分析

    本人企图在上传文件的时候,把请求参数打印出来(为了分析问题),输出方式用 FastJSON 中的方法**JSONObject.toJSONString()**序列化了一下参数 。在实际导出的过程中,发现所有导出导出的文件内容为空,百思不得其姐。

    于是进入 toJSONString() 方法,一路Debug进来,到了ListSerializer 这里,如下图:
    在这里插入图片描述
    itemSerializer这里实际对象是ASMSerializer(关于这玩意,查了一些资料,在FastJSON中使用它来实现反射),而在处理反射的过程中,会调用get方法获取属性值执行序列化。

    而在FileSystemResource 中,关于OutputStream 的获取,是会重新new一个FileOutputStream,再往方法里面看,发现了append属性为false,相当于按原来的路径重新写入了一个新文件,而且是不追加的方式。到这里也算明白了为啥我的文件导出来都为空了。

    //

    public class FileSystemResource extends AbstractResource implements WritableResource {
     //....
    
    public OutputStream getOutputStream() throws IOException {
            return new FileOutputStream(this.file);
        }
    
    }
    
    public FileOutputStream(File file) throws FileNotFoundException {
            this(file, false);
        }
    
    public FileOutputStream(File file, boolean append)
            throws FileNotFoundException
        {
            String name = (file != null ? file.getPath() : null);
            SecurityManager security = System.getSecurityManager();
            if (security != null) {
                security.checkWrite(name);
            }
            if (name == null) {
                throw new NullPointerException();
            }
            if (file.isInvalid()) {
                throw new FileNotFoundException("Invalid file path");
            }
            this.fd = new FileDescriptor();
            fd.attach(this);
            this.append = append;
            this.path = name;
    
            open(name, append);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    小结

    • JSONObject.toJsonString 使用还是得慎重
    • 复杂对象序列化时,特别是一些框架封装的对象还是得多多留意
  • 相关阅读:
    延迟任务多种实现姿势--上
    php程序设计的基本原则
    SQL Server教程 - T-SQL-存储过程(PROCEDURE)
    npm报错,显示certificate has expired
    考华为云认证的必要条件、注意事项
    .NET Core 日志系统
    一年前端面试打怪升级之路
    vue3中使用element-plus Notification通知组件内容添加点击自定义事件
    云酷科技UWB定位系统:智能巡检的新方式
    Nuscenes数据集总结(下)
  • 原文地址:https://blog.csdn.net/legendaryhaha/article/details/127937684