首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PrimeFaces 8.0 DefaultStreamedContent.builder().stream()请求SerializableSupplier<InputStream>

PrimeFaces 8.0 DefaultStreamedContent.builder().stream()请求SerializableSupplier<InputStream>
EN

Stack Overflow用户
提问于 2020-01-03 10:25:34
回答 4查看 13.7K关注 0票数 13

在PrimeFaces 8.0中,DefaultStreamedContent不能像new DefaultStreamedContent(inputStream, contentType, name)那样初始化,因为它已经被废弃了,而应该使用DefaultStreamedContent.builder()

尽管在执行.stream()时,它要求使用SerializableSupplier<InputStream>,而不是像8.0之前版本中的InputStream那样。

代码语言:javascript
运行
复制
DefaultStreamedContent.builder().contentType(contentType).name(name).stream(is).build();
                                                                            ^^

如何将InputStream转换为SerializableSupplier

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-01-03 10:37:10

所有东西都在这里的迁移指南中:https://github.com/primefaces/primefaces/wiki/Migration-Guide

一般而言,以下内容将起作用:

代码语言:javascript
运行
复制
DefaultStreamedContent.builder().contentType(contentType).name(name).stream(() -> is).build();

但改变背后的想法却是不同的。

如果您使用RequestScoped bean构建StreamedContent,那么您的bean和StreamedContent将被创建两次:

  1. 当呈现视图
  2. 时,流资源(这是一个新的浏览器请求!)

在这种情况下,您的is可能会创建两次。大多数情况下,这会导致一个无用的IO访问或DB调用。

要只创建一次is,您应该惰性地通过供应商lambda初始化它:

代码语言:javascript
运行
复制
DefaultStreamedContent.builder().contentType(contentType).name(name).stream(() -> new FileInputStream(....)).build();
票数 25
EN

Stack Overflow用户

发布于 2021-01-14 17:25:26

上面@tandraschko的惰性初始化答案在使用java 8的Netbeans中对我不起作用,我必须先创建FileInputStream,然后再将它注入构建器。

所以我的代码看起来是:

代码语言:javascript
运行
复制
public StreamedContent getFiledownload() {
        FileInputStream fis = new FileInputStream("...");
        filedownload = DefaultStreamedContent.builder()
                .contentType("...")
                .name("...")
                .stream(() -> fis)
                .build();
        return filedownload;
    }

我想,万一别人遇到编译问题,我会发表评论。

票数 0
EN

Stack Overflow用户

发布于 2020-06-26 15:51:57

这对我来说很管用

代码语言:javascript
运行
复制
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();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59576891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档