我目前正在编写一个带有spring boot的REST服务,它应该提供文件下载,i。即客户端应用程序可以从服务下载文件。一个文件可以是几千兆字节(有时比主存大),i。即将文件加载到主内存不是一个选项。因此,在向客户端发送文件时,我需要某种流媒体机制。
网上一个有希望的解决方案(取自here):
@RestController
// ...
@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
@ResponseBody
public FileSystemResource getFile(@PathVariable("file_name") String fileName) {
return new FileSystemResource(myService.getFileFor(fileName));
}
但它不起作用。我明白了:
java.lang.IllegalStateException:不支持的资源类:class org.springframework.core.io.FileSystemResource 在org.springframework.http.converter.ResourceHttpMessageConverter.readInternal(ResourceHttpMessageConverter.java:100)
我研究过但不知道是什么导致了这个问题。我尝试了其他方法(例如Downloading a file from spring controllers),但我得到了同样的错误。有谁知道为什么解决方案似乎适用于其他人而不适合我?
编辑:这是我调用REST服务的地方(jUnit测试用例):
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class DownloadTest {
@LocalServerPort
private int port;
private RestTemplate template;
private String requestPath;
@Before
public void setUp() throws Exception {
template = new RestTemplate();
requestPath = "http://localhost:" + port + "/files/download";
}
@Test
public void test() {
Resource FileSystemResource =
template.getForObject(requestPath, FileSystemResource.class);
}
}
答案 0 :(得分:0)
RestController的代码按预期工作,内存占用量很小(文件永远不会完全加载到主内存中)。
可以找到适合我的客户端代码(内存占用很少)here。
答案 1 :(得分:0)
我修复了java.lang.IllegalStateException:更改此
Resource FileSystemResource =
template.getForObject(requestPath, FileSystemResource.class);
为此
Resource FileSystemResource =
template.getForObject(requestPath, Resource .class);