我的REST控制器中有这样一种方法,返回文件数据:

@RequestMapping(
        value  = "by-id/{attachmentId}",
        method = RequestMethod.GET
)
public ResponseEntity<InputStreamResource> attachmentById(
        @PathVariable("attachmentId") String attachmentId) {
    GridFSDBFile file = service.getAttachment(attachmentId);

...... some unrelated code here, setting headers, etc .....

    return new ResponseEntity<InputStreamResource>(
                new InputStreamResource(file.getInputStream()), respHeaders, HttpStatus.OK);

}


这很好用,但是根据Fortify的报告,我将释放InputStream,显然在file.getInputStream()中打开了它。可能由于InputStream是自动关闭的,我不得不使用try-with-resources,或者在file.getInputStream().close()块中调用finally。但是似乎不能这样做,因为我完全不知道InputStreamResource的构造函数或其方法的实现,即该输入流是否仍在返回的ResponseEntity中使用。

我是什么做的?

最佳答案

我认为您已经能够找到问题的答案。而且,可能要对Fortify提出问题,因为Stream已被Spring关闭-请参阅“调查”-How to handle IO streams in Spring MVC

10-08 06:39