在PrimeFaces 8.0中,DefaultStreamedContent
不能像new DefaultStreamedContent(inputStream, contentType, name)
那样初始化,因为它已经被废弃了,而应该使用DefaultStreamedContent.builder()
。
尽管在执行.stream()
时,它要求使用SerializableSupplier<InputStream>
,而不是像8.0之前版本中的InputStream
那样。
DefaultStreamedContent.builder().contentType(contentType).name(name).stream(is).build();
^^
如何将InputStream
转换为SerializableSupplier
发布于 2020-01-03 10:37:10
所有东西都在这里的迁移指南中:https://github.com/primefaces/primefaces/wiki/Migration-Guide。
一般而言,以下内容将起作用:
DefaultStreamedContent.builder().contentType(contentType).name(name).stream(() -> is).build();
但改变背后的想法却是不同的。
如果您使用RequestScoped bean构建StreamedContent,那么您的bean和StreamedContent将被创建两次:
在这种情况下,您的is
可能会创建两次。大多数情况下,这会导致一个无用的IO访问或DB调用。
要只创建一次is
,您应该惰性地通过供应商lambda初始化它:
DefaultStreamedContent.builder().contentType(contentType).name(name).stream(() -> new FileInputStream(....)).build();
发布于 2021-01-14 17:25:26
上面@tandraschko的惰性初始化答案在使用java 8的Netbeans中对我不起作用,我必须先创建FileInputStream,然后再将它注入构建器。
所以我的代码看起来是:
public StreamedContent getFiledownload() {
FileInputStream fis = new FileInputStream("...");
filedownload = DefaultStreamedContent.builder()
.contentType("...")
.name("...")
.stream(() -> fis)
.build();
return filedownload;
}
我想,万一别人遇到编译问题,我会发表评论。
发布于 2020-06-26 15:51:57
这对我来说很管用
DataHandler dataHandler = someBean.getFileData();
byte contents[] = IOUtils.toByteArray(dataHandler.getInputStream());
StreamedContent streamedContent = DefaultStreamedContent.builder()
.name(someBean.getFileName())
.contentType("application/octet-stream")
.stream(() -> new ByteArrayInputStream(contents)).build();
https://stackoverflow.com/questions/59576891
复制相似问题