h:inputFile不会调用Part setter

时间:2016-03-08 14:30:46

标签: ajax jsf jsf-2.2

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

我的Managed Bean中Part属性的setter方法永远不会被调用,因此当调用upload方法时,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过滤器(我已尝试删除它,测试过并没有成功)。

2 个答案:

答案 0 :(得分:2)

经过多次尝试,在部署了一个只有默认值的新项目之后(就像@BalusC在我的问题评论中所说的那样),我发现问题是web.xml中的PrimeFaces FileUploadFilter !!

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

但是现在我再次尝试了它的确有效!

感谢@BalusC的帮助!

答案 1 :(得分:0)

感谢BalusC和Diego Marques!我的应用程序遇到了类似的问题,它部署在Tomcat 8上 - h:inputFile值&#34; Part&#34;塞特从未被召唤过。您的帮助向我指出了一些已经发现我的问题实际上是Tomcat设置的库。

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

<Context allowCasualMultipartParsing="true"

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

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