h:inputFile 没有调用部分 setter

h:inputFile doesn't call Part setter

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

我的托管 Bean 中的 Part 属性的 setter 方法从未被调用,因此当调用上传方法时,Part 对象始终为 null。

Form 和 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>

并在命令链接中使用 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 过滤器(我已经尝试删除它,经过测试但没有成功)。

经过几次尝试并部署了一个只有默认值的新项目(就像@BalusC 在我的问题的评论中所说的那样),我发现问题出在 [=20 中的 PrimeFaces FileUploadFilter =]!!

我之前解决过,但不知道为什么那次没用,可能是Eclipse提供的项目部署刷新有问题。

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

感谢@BalusC 的帮助!

感谢 BalusC 和 Diego Marques!我的应用程序也有类似的问题,它部署在 Tomcat 8 - h:inputFile 值 "Part" setter 从未被调用过。你的帮助让我找到了我的一些库,它们已经发现我的问题实际上是 Tomcat 设置。

如果将其包含在这里也有帮助,Tomcat(可能还有 Glassfish)需要以下设置才能使其成为 "spec-compliant"。

<Context allowCasualMultipartParsing="true"

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

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