在PrimeFaces 8.0中, DefaultStreamedContent 不能像 new DefaultStreamedContent(inputStream, contentType, name) 那样初始化,因为它已经被废弃了,而应该使用 DefaultStreamedContent.builder() 。
DefaultStreamedContent
new DefaultStreamedContent(inputStream, contentType, name)
DefaultStreamedContent.builder()
尽管在执行 .stream() 时,它要求使用 SerializableSupplier<InputStream> ,而不是像8.0之前版本中的 InputStream 那样。
.stream()
SerializableSupplier<InputStream>
InputStream
DefaultStreamedContent.builder().contentType(contentType).name(name).stream(is).build(); ^^
如何将 InputStream 转换为 SerializableSupplier
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
要只创建一次 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;