有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java PrimeFaces 8.0 DefaultStreamedContent。生成器()。stream()要求SerializableSupplier<InputStream>

在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


共 (4) 个答案

  1. # 1 楼答案

    上面@tandraschko给出的惰性初始化答案在使用Java8的Netbeans中不适用。我必须先创建FileInputStream,然后再将其注入构建器

    所以我的代码看起来像:

    public StreamedContent getFiledownload() {
            FileInputStream fis = new FileInputStream("...");
            filedownload = DefaultStreamedContent.builder()
                    .contentType("...")
                    .name("...")
                    .stream(() -> fis)
                    .build();
            return filedownload;
        }
    

    我想我会发表评论,以防其他人遇到编译问题

  2. # 2 楼答案

    对于MySQL存储的图像,我使用以下方法:

    resultset = statement.executeQuery("call sp_query()");
    if(resultset.next()) {
    
        new DefaultStreamedContent();
        StreamedContent photo = DefaultStreamedContent.builder().contentType("contentType").name("name").stream(() -> resultset.getBinaryStream("picture")).build());
    }
    
    // Close the connection
    con.close();
    
  3. # 3 楼答案

    这对我有用

    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();
    
  4. # 4 楼答案

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

    一般来说,以下几点会起作用:

    DefaultStreamedContent.builder().contentType(contentType).name(name).stream(() -> is).build();
    

    但这一变化背后的理念是不同的
    如果使用RequestScope bean构建StreamedContent,那么将创建两次您的bean,从而创建StreamedContent:

    1. 渲染视图时
    2. 流式传输资源时(这是一个新的浏览器请求!)

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

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

    DefaultStreamedContent.builder().contentType(contentType).name(name).stream(() -> new FileInputStream(....)).build();