【问题标题】:Primefaces 6 fileupload issue on JBoss EAP 7.3JBoss EAP 7.3 上的 Primefaces 6 文件上传问题
【发布时间】:2021-10-04 05:05:27
【问题描述】:

我在 Java 应用程序 (Java 8) 上使用 Primefaces 6,它在 JBoss EAP 7.0 (Java 8) 上运行没有任何问题。

当我在 JBoss EAP 7.3.7(在 Java 11 上运行)上部署完全相同的战争时,fileUpload 似乎不再工作,并且根本没有触发 fileUploadListener。相反,在 中定义的方法似乎是唯一触发的方法

Javascript/HTTP、Jboss 和应用程序日志不显示任何类型的错误。应用程序的其余部分似乎运行良好。

<p:fileUpload id="templateUpload" 
fileUploadListener="#{myHandler.uploadFile}" mode="advanced" dragDropSupport="true"
update=":myForm:fileTable @this"
skinSimple="true" label="Label1" cancelLabel="Label2"
uploadLabel="Label3" sizeLimit="500000" allowTypes="/(\.|\/)(pdf)$/" fileLimit="1"
invalidSizeMessage="Label4"
invalidFileMessage="Label5"
fileLimitMessage="Label6"
/>

处理程序是用@ManagedBean 和@ViewScoped 定义的,而我的方法如下所示:

public void uploadFile(final FileUploadEvent event) 

还有我的 HTTP Post 请求,似乎包含文件并发送为

Content-Type: multipart/form-data;
Accept-Encoding: gzip, deflate
Accept: application/xml, text/xml, */*; q=0.01

我看到的主要变化是 JSF 版本(JBoss 7.3.7 上的 2.2 到 2.3)。很可能我的问题就在那里。

【问题讨论】:

  • 您使用的是 Commons FileUpload 还是 JSF 2.3 原生上传和 PF?它可能是 Commons Filepload 的问题,您可以尝试本地上传,因为您使用的是具有 JSF 2.3 的 Jboss 7.3
  • 我正在使用提供的 jboss-jsf-api_2.3_spec 依赖项。我看到 Primefaces 和 JSF 2.3 的旧版本报告了许多问题。我会尝试将 PF 升级到最新版本,看看问题是否仍然存在。

标签: jsf primefaces jboss


【解决方案1】:

Primefaces 6.1 和 JBoss EAP 6.3 我也遇到过同样的问题。调试应用程序,我发现 Primefaces (PrimeConfiguration.java) 检查应用程序服务器是否支持 JSF 2.3 如下(对于 JSF 2.2、JSF 2.1 相同):

private boolean detectJSF23() {
    String version = FacesContext.class.getPackage().getImplementationVersion();

    if(version != null) {
        return version.startsWith("2.3");
    }
    else {
        //fallback
        try {
            Class.forName("javax.faces.component.UIImportConstants");
            return true;
        }
        catch (ClassNotFoundException ex) {
            return false;
        }
    }
}

方法 getImplementationVersion => 返回此实现的版本。它由此实现的供应商分配的任何字符串组成,并且没有 Java 运行时指定或期望的任何特定语法。

在 JBoss EAP 6.3 中,getImplementationVersion 返回字符串 "3.0.0.SP01-redhat-00001",因此它不匹配。

在应用服务器至少没有 JSF 2.2 的情况下,FileUploadRenderer (FileUploadRenderer.java) 使用 Commons File Uploader 实现而不是 Native File Uploader 实现。

public void decode(FacesContext context, UIComponent component) {...
        PrimeConfiguration cc = RequestContext.getCurrentInstance().getApplicationContext().getConfig();
        String uploader = cc.getUploader();
        boolean isAtLeastJSF22 = cc.isAtLeastJSF22();
        String inputToDecodeId = getSimpleInputDecodeId(fileUpload, context);


        if (uploader.equals("auto")) {
            if (isAtLeastJSF22)
                NativeFileUploadDecoder.decode(context, fileUpload, inputToDecodeId);
            else
                CommonsFileUploadDecoder.decode(context, fileUpload, inputToDecodeId);
        }

我自己实现了 FileUploadRenderer 以始终使用 JBoss EAP 7.3 中的 Native 实现,因为根据 RedHat 文档,JBoss EAP 7.3 使用 JSF 2.3。它解决了我的问题。

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 2021-08-07
    • 2018-05-27
    • 2013-07-10
    • 2021-03-31
    • 1970-01-01
    • 2015-05-05
    • 2016-03-04
    相关资源
    最近更新 更多