【问题标题】:h:inputFile doesn't call Part setterh:inputFile 不调用 Part setter
【发布时间】:2016-06-22 13:21:39
【问题描述】:

这是我第一次使用 h:inputFile,但遇到了一些麻烦。

我的 Managed Bean 中的 Part 属性的 setter 方法从不被调用,所以当调用上传方法时,Part 对象始终为 null。

表单和 inputFile 组件

<h:form enctype="multipart/form-data">
    <div class="pic add-pic">
        <h:inputFile id="upload-test" required="true"
            value="#{uploadController.uploadedFile}">
        </h:inputFile>
        <h:commandLink styleClass="pic add-pic"
            action="#{uploadController.addPic()}">
            <i class="fa fa-plus"></i>
            <span>Add pic</span>
        </h:commandLink>
    </div>
</h:form>

托管 Bean

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.servlet.http.Part;

@ManagedBean
@ViewScoped
public class UploadController {
    private Part uploadedFile;

    public Part getUploadedFile() {
        return this.uploadedFile;
    }

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

    public void addPic() {
        System.out.println("Uploaded a file: " +
            uploadedFile.getSubmittedFileName());
    }
}

我已经在 inputFile 中尝试过使用 ajax

<h:inputFile id="upload-test" required="true"
    value="#{uploadController.uploadedFile}">
    <f:ajax execute="@form" listener="#{uploadController.addPic()}" />
</h:inputFile>

并在 commandLink 中使用 ajax

<h:commandLink styleClass="pic add-pic">
    <i class="fa fa-plus"></i>
    <span>Add pic</span>
    <f:ajax execute="@form" listener="#{uploadController.addPic()}" />
</h:commandLink>

但是这两个选项都没有效果。

PS:我正在使用 javax.servlet-api 3.1 版和 JSF 2.2.12 (Mojarra) 并在 Wildfly 9.0.2 上运行

PS2:我也在使用 Primefaces(在这种情况下不是),并且我的 web.xml 中有 fileUpload 过滤器(我试图删除它,经过测试但没有成功) .

【问题讨论】:

  • 您不应该将 Servlet API 捆绑在 webapp 中。您不应该将 JSF API/impl 捆绑在 webapp 中。您不应该在 webapp 中配置 PrimeFaces FileUploadFilter。请确认您已将它们全部清除。当不确定时,只需从头开始创建一个完全空的测试项目,不要触摸库/默认值。
  • 哦,对不起,如果我把它们捆绑在一起,我只是想展示我正在使用的版本,它们没有捆绑。我已经摆脱了 PrimeFaces 过滤器,但问题仍然存在
  • 问题在目前提供的信息中不可见。确定您没有嵌套表单或使用自定义/第 3 方过滤器?复制粘贴到临时项目中时,您的代码可以正常工作。

标签: ajax jsf jsf-2.2


【解决方案1】:

经过几次尝试并部署了一个只有默认值的新项目(就像@BalusC 在我的问题的 cmets 中所说的那样),我发现问题出在 web.xml 中的 PrimeFaces FileUploadFilter !!强>

我之前已经摆脱了它,但我不知道为什么那个时候没有工作,可能是Eclipse提供的项目部署刷新有问题。

但现在我又试了一次,它成功了!

感谢@BalusC 的帮助!

【讨论】:

  • @Diego 也一样。使用 JSF 2.2 inputFile 组件,我从 web.xml 中删除了我的 PrimeFaces 过滤器/映射,然后它工作得很好。
【解决方案2】:

感谢 BalusC 和 Diego Marques!我的应用程序也有类似的问题,它部署在 Tomcat 8 上 - h:inputFile 值“Part”设置器从未被调用过。您的帮助指出了我的一些库,这些库已经发现我的问题实际上是 Tomcat 设置。

如果将它也包含在此处也有帮助,Tomcat(可能还有 Glassfish)需要以下设置以使其“符合规范”。

<Context allowCasualMultipartParsing="true"

https://github.com/ocpsoft/rewrite/issues/136

您可以使用@MultipartConfig(和@WebServlet)标记您的bean,而不是进行上述上下文设置。

【讨论】:

    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 2012-10-25
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多