在为现有的spring框架中的一个controller增加一个导出excel的功能时,发现了一个问题。无论如何在接口中将文件写入流中,网页下载的excel文件始终是空文档,只包含一行默认的返回json。
debug发现,框架中使用一个过滤器处理网络请求和返回。这个过滤器会在主应用处理完当前网络请求之后,强行将返回值转成字符串,并且按照json形式返回。这就导致在流中写入excel文件后,即使关闭、刷新流,过滤器也是当作空返回值,然后清空流,向流中写入默认的返回json值。这样即使下载到了文档,也只是包含一行默认的返回json。
因此需要特殊判断来规避这个逻辑。利用请求路径的后缀、返回代码等各种手段,同时将excel文件的相关属性、携带信息等赋值在返回信息中,在过滤器里拦截该请求。当逻辑发现这个请求是下载excel文件时,直接调用相关excel工具类,利用返回信息中的信息重新组装文件,并写入流中,避免原先向流中写入默认的返回json值的逻辑。
于是这个问题就这么解决了。