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 7 上的现有战争
javax.jms.TransactionInProgressException: 无法在 JBoss EAP 6.2 和 Active MQ 5.10.0 上的 XASession 中回滚()