- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 MongoDB,它存储一个 csv 文件和两个微服务(Spring Boot 应用程序)。一个微服务处理文件上传并支持将这些文件作为流获取。另一个微服务处理文件。这些微服务是分开的,因为我以后可能想以不同于 MongoDB 的其他方式存储文件,并且我不想由此影响其他服务。
我的问题是,当文件服务将文件作为 InputStreamResource 返回时,如下所示:
@RequestMapping(value = "/upload/{importId}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<InputStreamResource> getUploadedFile(@PathVariable("importId") String importId)
throws ImportFileNotFoundException {
GridFSDBFile file = FileImportClient.getInstance().getFile(importId);
return ResponseEntity
.ok()
.contentLength(file.getLength())
.body(new InputStreamResource(file.getInputStream()));
}
我想从已经关闭的流中读取。
ResponseEntity<InputStreamResource> response = restTemplate
.getForEntity("http://upload-service/upload/" + importId, InputStreamResource.class);
BufferedReader fileReader = new BufferedReader(new InputStreamReader(response.getBody().getInputStream()));
for (CSVRecord record : CSVFormat.DEFAULT.parse(fileReader)) {/*toStuff()*/}
我得到一个 java.io.IOException: Stream closed
由解析方法引起。
如果我只是 curl localhost:<port>/upload/<importId>
我得到了整个 csv 文件。有谁知道为什么 InputStream 关闭以及如何解决?
堆栈跟踪:
java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:170)
at java.io.BufferedInputStream.read(BufferedInputStream.java:336)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.read1(BufferedReader.java:210)
at java.io.BufferedReader.read(BufferedReader.java:286)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.read(BufferedReader.java:182)
at org.apache.commons.csv.ExtendedBufferedReader.read(ExtendedBufferedReader.java:60)
at org.apache.commons.csv.Lexer.nextToken(Lexer.java:89)
at org.apache.commons.csv.CSVParser.nextRecord(CSVParser.java:498)
at org.apache.commons.csv.CSVParser$1.getNextRecord(CSVParser.java:439)
at org.apache.commons.csv.CSVParser$1.hasNext(CSVParser.java:452)
at <mypackage>.<myclass>.process(<myclass>.java:71)
最佳答案
我通过此链接找到了解决方案:https://jira.spring.io/browse/SPR-7357
[This answers my question] Note that you cannot simply return the InputStream from the extractor, because by the time the execute method returns, the underlying connection and stream are already closed
[This fixes the problem] You can already read an InputStream by using the execute() method on the RestTemplate in combination with a ResponseExtractor implementation
我尝试使用 ResponseExtractor,现在可以正常使用了。它看起来像这样:
return restTemplate.execute(new URI("http://<myservice>/upload/" + importId), HttpMethod.GET, null,
new ResponseExtractor<MyObject>() {
@Override
public MyObject extractData(ClientHttpResponse response) throws IOException {
CSVParser parse = CSVFormat.DEFAULT.parse(new BufferedReader(new InputStreamReader(response.getBody())));
for (CSVRecord record : parse) {/*dostuff*/}
return new MyObject();
}
});
关于java - 为什么当我开始读取时 InputStreamResource 关闭了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35292207/
我有一个 MongoDB,它存储一个 csv 文件和两个微服务(Spring Boot 应用程序)。一个微服务处理文件上传并支持将这些文件作为流获取。另一个微服务处理文件。这些微服务是分开的,因为我以
我有一个 servlet 返回图像为 InputStreamResource .根据一些 get query 将返回大约 50 张静态图像。参数。 为了不必在每次请求时都查找这些图像(这很常见),我想
我正在尝试创建一个发送 Excel 文件的 InputStreamResource 的 API。它是在服务器端根据表的数据创建的。 当我从 postman 那里点击这个 api 时,excel 文件没
我的 REST Controller 中有这样一个方法,返回文件数据: @RequestMapping( value = "by-id/{attachmentId}",
我正在开发一个 Spring Boot 应用程序,它应该允许用户通过指定的应用程序 REST 接口(interface)从 Amazon S3 间接下载文件。为此,我有一个 REST-Controll
我正在尝试从 aws s3 存储桶中读取文件并将其设置为我的 spring batch 读取器类中的资源。当我在 aws lambda 函数上测试应用程序时,出现以下错误。任何建议专家? Ca
我是一名优秀的程序员,十分优秀!