前言
作业提交系统匆匆上线后,在判卷过程中发现,当点击下一个作业时,作业的文件目录不显示。这导致我一度以为学生交了白卷上去,果断打了 0 分。后来在好友的提醒下,才发现这个问题。我们发现只有当第一次点进去的作业才有文件目录,其他自动下一个的作业无文件目录。
排查
首先,一开始怀疑 v 层显示有问题,看了看其他地方,写法差不多,并且第一个作业正常显示,没问题。
然后看一下 c 层,前台打印一下作业相关文件信息,发现为 undefined。
第一次数据初始化和后面的下一个作业请求的是不同地址。但是都是将返回的 data 赋值给 work,一个是返回的是 work 类型,一个返回的是 Page<Work> 类型。work 都应该是完整的接收到了后台返回的数据才对。
然后又去看了眼后台,想起了自己原来写的 @JsonView,恍然大悟。
原来请求下一个未评阅的方法为了方便,直接请求后台的 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。
版权声明
本文作者:河北工业大学梦云智开发团队 – 刘宇轩