【问题标题】:seam s:fileupload is always null接缝 s:fileupload 始终为空
【发布时间】:2018-06-25 03:33:45
【问题描述】:

我正在尝试使用 s:fileUpload 组件,这会导致设置 bean 变量时出现问题。它总是返回 null。这是xhtml:

            <h:form enctype="multipart/form-data">
                <s:fileUpload id="pictureproc" data="#{uploader.file}" />
            <h:commandButton id="doanything"
                action="#{uploader.filehash(pictureproc)}"
                value="Show file hash" />
            </h:form>

还有豆子:

@Name("uploader")
@Scope(ScopeType.SESSION)
public class Uploader {
    byte[] file;

    public byte[] getFile() {
        return file;
    }

    public void setFile(byte[] file) {
        this.file = file;
        System.out.println("uploaded");
    }

    public void filehash(byte[] file) {
        System.out.println(file.hashCode()); // here goes the NPE
    }
}

我已经在 web.xml 和 components.xml 中包含了所有内容:

<filter>
    <filter-name>Seam Filter</filter-name>
    <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>Seam Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

和组件:

    <web:multipart-filter create-temp-files="true"
    max-request-size="10485760" url-pattern="*.seam" />

    <component class="org.jboss.seam.web.MultipartFilter">
        <property name="createTempFiles">true</property>
        <property name="maxRequestSize">1000000</property>
    </component>

并记录:

引起:javax.faces.el.E​​valuationException: java.lang.NullPointerException 在 javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) 在 com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) ... 54 更多 引起:java.lang.NullPointerException 在 com.example.Uploader.filehash(Filter.java:57)

我也尝试在 setter 中直接记录它,但它也返回 NULL。 接缝 2.2,JSF 1.0

【问题讨论】:

  • 它为空,因为它没有被提交(与命令按钮的形式不同)
  • 我把它移到了同一个表单中,它什么也没做,也不调用 setter。页面重新加载后表单组件消失,现在如果我再次单击它会像以前一样抛出 NPE。

标签: java jsf seam


【解决方案1】:

您正在向您的 filehash 方法发送一个空值 h:commandButton(pictureproc)

从你的操作方法中移除参数到

<h:form enctype="multipart/form-data">
     <s:fileUpload id="pictureproc" data="#{uploader.file}" />
     <h:commandButton id="doanything"
         action="#{uploader.filehash()}"
         value="Show file hash" />
 </h:form>

然后在你的类中从 filehash 方法中删除参数 byte[],并改为引用类属性

@Name("uploader")
@Scope(ScopeType.SESSION)
public class Uploader {
    byte[] file;

    public byte[] getFile() {
        return file;
    }

    public void setFile(byte[] file) {
        this.file = file;
        System.out.println("uploaded");
    }

    public void filehash() {
        System.out.println(this.file.hashCode()); // here goes the NPE
    }
}

请记住,文件正在传输并存储在您的 s:fileUpload 数据组件引用的属性中,而不是通过在您的 h:commandButton 操作中传递其 id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2019-07-18
    • 2019-08-18
    • 2011-12-29
    • 2019-07-02
    相关资源
    最近更新 更多