JBoss EAP 7.3 上的 Primefaces 6 文件上传问题

Posted

技术标签:

【中文标题】JBoss EAP 7.3 上的 Primefaces 6 文件上传问题【英文标题】:Primefaces 6 fileupload issue on JBoss EAP 7.3 【发布时间】: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 升级到最新版本,看看问题是否仍然存在。 【参考方案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。它解决了我的问题。

【讨论】:

以上是关于JBoss EAP 7.3 上的 Primefaces 6 文件上传问题的主要内容,如果未能解决你的问题,请参考以下文章

JBoss EAP 6.1+ 上的 JDBC 模块

从 Camel 连接到 JBoss EAP6 上的队列

在不重新部署的情况下更新 jboss EAP 7 上的现有战争

javax.jms.TransactionInProgressException: 无法在 JBoss EAP 6.2 和 Active MQ 5.10.0 上的 XASession 中回滚()

无法在 JBoss EAP 6 中解包 TmesTen 数据源 JDBC 对象

Jenkins 使用 Deploy to Container 插件部署到 JBoss EAP7