使用Tomahawk提交jsf上传请求时,UploadedFile为null [英] UploadedFile is null when submit jsf upload request with Tomahawk

查看:75
本文介绍了使用Tomahawk提交jsf上传请求时,UploadedFile为null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试使用Tomahawk2.0 1.1.11在facelets页面上上传文件.但是我得到了一个空指针异常,并且在调试器中看到,未在bean中设置uploadFile变量.有什么想法为什么不设置bean? t:inputFileUpload组件将按我期望的方式呈现和运行.

trying to upload a file on a facelets page using Tomahawk2.0 1.1.11. But I get a null pointer exception and I see in the debugger, the uploadedFile variable is not being set in the bean. Any ideas why the bean isn't being set? The t:inputFileUpload component is otherwise rendering and functioning as I would expect.

页面:

<h:form enctype="multipart/form-data">
<t:inputFileUpload value="#{Bean.uploadedFile}" />
<h:commandButton type="submit" id="Submit" value="Submit" action="#{Bean.submit}"/>
<h:messages />  
</h:form>

bean:

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

public String submit()  throws IOException { 
String fileName = FilenameUtils.getName(uploadedFile.getName()); // exception here!!
String contentType = uploadedFile.getContentType();
byte[] bytes = uploadedFile.getBytes();
FacesContext.getCurrentInstance().addMessage(null, 
new FacesMessage(String.format("File '%s' of type '%s' successfully uploaded!", 
fileName, contentType)));

return "success";     
}

例外发生在提交的第一行.在调试器中,我看到uploadFile为null. jsf页面看起来不错,我可以使用浏览按钮来选择一个文件.按提交后,我看到bean中的uploadFile为空.

The exception happens on the first line of submit. In the debugger I see that uploadedFile is null. The jsf page looks fine and I can use the browse button to choose a file. After I press submit I see uploadedFile in the bean is null.

错误消息:

16:06:59,699 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/Framework].[Faces Servlet]] (http--127.0.0.1-8080-2) Servlet.service() for servlet Faces Servlet threw exception: java.lang.NullPointerException
    at net.gui.bean.Bean.submit(Bean.java:118) [classes:]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_30]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_30]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_30]
    at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_30]
    at org.apache.el.parser.AstValue.invoke(AstValue.java:196) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
    at javax.faces.component.UICommand.broadcast(UICommand.java:315) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final] 
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:357) [tomahawk20-1.1.11.jar:] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at net.gui.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:34) [classes:] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at net.gui.filter.NAISAuthFilter.doFilter(NAISAuthFilter.java:59) [classes:] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final]
    at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.1.Final.jar:7.0.2.Final] 
    at java.lang.Thread.run(Thread.java:662) [:1.6.0_30]

web.xml:

<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
    <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>    

<filter>
    <filter-name>NaisAuth</filter-name>
    <filter-class>net.gui.filter.NAISAuthFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>NaisAuth</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
<filter-name>HibernateFilter</filter-name>
<filter-class> net.gui.filter.HibernateSessionRequestFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

推荐答案

NAISAuthFilterHibernateSessionRequestFilter事先通过getParameter()getReader()等访问了请求正文时,可能会发生这种情况.主体已经被解析,而ExtensionsFilter才有机会这样做.

That can happen when either NAISAuthFilter or HibernateSessionRequestFilter have accessed the request body beforehand by getParameter(), getReader(), etc. This way the request body is already parsed before the ExtensionsFilter ever get chance to do it.

要么修复这些过滤器,要么在这些过滤器之前重新排列web.xml中的ExtensionsFilter映射,以声明为.

Either fix those filters, or rearrange the mapping of ExtensionsFilter in web.xml to be declared before those filters.

另一个可能的原因是您实际上相互嵌套了多个<h:form>组件.这将导致非法的HTML语法,并且浏览器的行为在处理表单提交时未指定.您需要确保您不嵌套表格(但是,多个并行表格是完全有效的).

Another possible cause is that you're actually nesting multiple <h:form> compnents in each other. This will result in illegal HTML syntax and the browser behaviour is unspecified as to processing form submits. You need to ensure that you aren't nesting forms (multiple forms in parallel is however perfectly valid).

这篇关于使用Tomahawk提交jsf上传请求时,UploadedFile为null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆