1

前言

作业提交系统匆匆上线后,在判卷过程中发现,当点击下一个作业时,作业的文件目录不显示。这导致我一度以为学生交了白卷上去,果断打了0分。后来在好友的提醒下,才发现这个问题。我们发现只有当第一次点进去的作业才有文件目录,其他自动下一个的作业无文件目录。
image.png

排查

首先,一开始怀疑v层显示有问题,看了看其他地方,写法差不多,并且第一个作业正常显示,没问题。
然后看一下c层,前台打印一下作业相关文件信息,发现为undefined。
image.png
第一次数据初始化和后面的下一个作业请求的是不同地址。但是都是将返回的data赋值给work,一个是返回的是work类型,一个返回的是Page<Work>类型。work都应该是完整的接收到了后台返回的数据才对。
image.png

image.png
然后又去看了眼后台,想起了自己原来写的@JsonView,恍然大悟。
image.png
原来请求下一个未评阅的方法为了方便,直接请求后台的getAll方法,然后拿出来第一个未评阅的作业给work。但是后台的getAll方法当初设计的时候减少非必要的信息,没有让他返回Attachments也就是作业文件字段。从而导致了前台获取不到文件字段。问题的原因找到了,问题也就迎刃而解,直接修改后台getAll的JsonView,在GetAllJsonView定义上继承Work.AttachmentsJsonView,问题解决,提交。

如何避免

这貌似只是解决了当前问题,却使得要改变@JsonView,感觉不应该这么改。
一开始想写单元测试避免这种情况再发生,但是从前台c层想到前台m层,在想到后台c层,发现这并不是单元测试能够解决的。前台只要有数据就正常显示没问题,后台getAll方法不返回作业文件也没问题。问题是我们的前台本应想获取某一作业,却请求了后台getAll方法。
解决:
通过上面的分析,我们要恢复后台返回给前台单个作业的方法。那我们只能在后台m层通过获取未评阅的第一个作业来获取下一个作业。

/**
 * 得到下一个未评阅的作业
 * @return 作业
 */
@Override
public Work getNextNotReviewedWork() {
    Pageable pageable = PageRequest.of(0,10);
    Page<Work> works = this.getAll(null, null, null, false, pageable);
    List<Work> workList = works.getContent();
    Work work = workList.get(0);
    return work;
}

这样修改虽然费事了点,但是感觉更加规范。

总结

有些是单元测试解决不了的问题,这时只能靠我们的规范来减少bug。

版权声明

本文作者:河北工业大学梦云智开发团队 - 赵凯强


小强Zzz
1.2k 声望32 粉丝