【问题标题】:p:fileUploadListener is not invoked [duplicate]p:fileUploadListener 未被调用[重复]
【发布时间】:2013-09-15 20:15:28
【问题描述】:

我正在使用,

  • GlassFish 4.0
  • JSF 2.2
  • Mojarra 2.2.0
  • Primefaces 3.5

我在 XHTML 页面上有这个 fileUpload 组件。

<h:form enctype="multipart/form-data">

    <p:fileUpload id="txtCatImage" 
                  value="#{testManagedBean.uploadedFile}"
                  mode="advanced"
                  sizeLimit="100000"
                  multiple="false"
                  showButtons="true" 
                  allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
                  fileUploadListener="#{testManagedBean.fileUploadListener}"/>

    <p:message for="txtCatImage" showSummary="false"/>

    <p:commandButton id="btnSubmit" 
                     actionListener="#{testManagedBean.insert}" 
                     icon="ui-icon-check" value="Save"/>
</h:form>

这是对应的托管 bean。

@ManagedBean
@ViewScoped
public final class TestManagedBean implements Serializable {

    private UploadedFile uploadedFile;
    private static final long serialVersionUID = 1L;

    public TestManagedBean() {}

    public UploadedFile getUploadedFile() {
        return uploadedFile;
    }

    public void setUploadedFile(UploadedFile uploadedFile) {
        this.uploadedFile = uploadedFile;
    }

    public void fileUploadListener(FileUploadEvent event) {
        uploadedFile = event.getFile();
        System.out.println("fileUploadListener invoked.");
    }

    public void insert() {
        if (uploadedFile != null) {
            System.out.println(uploadedFile.getFileName());
        } else {
            System.out.println("The file object is null.");
        }
    }
}

前面提到的文件上传监听器 - fileUploadListener() 永远不会被调用。

文件上传过滤器在web.xml中映射如下。

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

我已将Apache-commons-fileuploadApache-commons-io 添加到类路径中。同样的事情在我早期的 Spring / JSF 项目中也有效。

我看不到我在这里缺少什么。是不是跟服务器的版本有关系?

【问题讨论】:

  • 我已将 Apache-commons-fileupload 和 Apache-commons-io 添加到类路径中。 你是如何完成这一步的?有很多方法可以做到这一点,而其中许多方法对于 WAR 来说是完全错误的。您是否确认这些 JAR 确实最终位于构建/部署的 WAR 文件的 /WEB-INF/lib 文件夹中?
  • 我刚刚检查了它们。部署应用程序后,两个 jar 文件都存在于$Project/Project-war/build/web/WEB-INF/lib
  • 好的。如果您删除/禁用所有与安全相关的过滤器和东西怎么办? (只是为了排除它们成为原因)如果您尝试 JSF 2.1 会怎样? (JSF 2.2 自带了自己的原生文件上传解析器,不确定 PrimeFaces 3.5 是如何作用的,我自己从未尝试过)。
  • 我尝试了与在 Mojarra 2.1.6、JSF 2.1 和 PrimeFaces 3.5 上运行的 GlassFish 3.1.2 的问题相同的场景。它可以正常工作。
  • 在 GlassFish 4.0 上通过禁用安全过滤器和安全约束进行了尝试,但没有奏效。

标签: jsf file-upload jsf-2 primefaces


【解决方案1】:

这很可能是因为 Primefaces 4 是唯一兼容 Glassfish 4 (Java EE 7) 中最新 JSF 标准的版本。 Primefaces 3.5 适用于 Glassfish 3.1.2.2 (Java EE 6)
有更多人遇到此问题。
9 月 16 日星期一将推出 Primefaces 4.0 RC1,所以如果你真的想要 GF 4,你应该尝试一下。

编辑:
参考:Glassfish 4, JSF 2.2 and PrimeFaces FileUploadEvent not working together
用户可以自行决定 RC 是否对他来说足够好。我刚刚向他提出了建议,因为这是目前唯一的方法。

【讨论】:

  • 'Primefaces 4 是唯一与 Glassfish 4 (Java EE 7) 中最新的 JSF 标准兼容的版本'你能发表任何关于这个事实的报价吗? “9 月 16 日星期一将推出 Primefaces 4.0 RC1”,这是一个候选版本,也许迁移到测试版实际上并不是 OP 的选择。 '有更多的人遇到这个问题' 相同,您需要在这里提供参考。
  • 您发布的链接是在谈论 JSF 2.2,而用户说他使用的是 2.0。 Appart 从该链接中我看不到任何与 Java EE 7 相关的内容。为什么不能只是玻璃鱼问题?
  • 我的回答是对的。再看看这里:facebook.com/groups/primefaces/permalink/10151467884751333。 Çağatay Çivici 是 PF 的创建者和所有者。检查他的回复。由于 GF 4 是 Java EE 7 的实现,因此 JSF 2.2、Primefaces 3.5 与 GF 4 不兼容。如果您仍然不明白,请查看此页面:glassfish.java.net。上面写着 JAVA EE 7。你现在满意吗?
  • 对不起,我不小心发布了 JPA 2.0 版。它是 JSF 2.2,Mojarra 2.2.0。
  • 已达到每日投票上限”。我今天不能投票。不过我明天会做。谢谢。
【解决方案2】:

如果您使用Primefaces上传,您必须注意以下情况。

  1. 不要使用ajax请求,也就是说,你必须把ajax="false"属性放在你的&lt;p:commandButton...&gt;中。否则,使用&lt;h:commandButton&gt;
  2. 如果要显示动态图像,backing bean 的范围必须是Session Scope。否则,您必须将文件写入临时存储并使用此文件路径显示动态图像。

参考是here

【讨论】:

  • 1.是错的。 OP 正在使用mode="advanced"。仅应在 mode="simple" 上禁用 ajax。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
相关资源
最近更新 更多