spring 4.3.6,jsf 2.2.14,primefaces 6.1,jetty 9.4.4。
当我从Primefaces'发送太大的图片时textEditor到Jetty服务器,从Jetty收到的日志中有[WARNING]:org.eclipse.jetty.http.BadMessageException:400:无法解析表单内容。如何通知客户端用户该问题?
以下是我的5次尝试,我是如何尝试解决的:
1)我尝试在view.xhtml中添加验证:
<p:textEditor id="questionEditor" value="#{manageQuestionsMB.text}" width="950" height="300" style="margin-bottom:10px">
<f:validateLength maximum="10" />
</p:textEditor>
<p:commandButton value="Save" actionListener="#{manageQuestionsMB.save()}" style="margin-top:10px;" />
如果textEditor仅包含字符,但没有图片,则上述验证有效。 (textEditor将图片表示为<img src="data:image/jpeg;base64, ... >
)。
2)我试图添加验证器:
<p:textEditor id="questionEditor" validator="#{manageQuestionsMB.validate()}" value="#{manageQuestionsMB.text}" width="950" height="300" style="margin-bottom:10px">
</p:textEditor>
如果是大图片,没有validate(),则不会调用save()方法。只是Jetty在日志中的警告。
3)我尝试将ExceptionHandler添加到faces-config.xml
<application>
<el-resolver>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerELResolver</el-resolver>
</application>
<factory>
<exception-handler-factory>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerFactory</exception-handler-factory>
</factory>
使用view.xhtml中的代码
<p:ajaxExceptionHandler type="java.lang.BadMessageException" update="exceptionDialog" onexception="PF('exceptionDialog').show();" />
<p:dialog header="Content" widgetVar="exceptionDialog" >
<p:outputPanel id="display">
<h:outputText value="#{pfExceptionHandler.type}" escape="false" />
<h:outputText value="#{pfExceptionHandler.message}" escape="false" />
<h:outputText value="#{pfExceptionHandler.formattedStackTrace}" escape="false" />
</p:outputPanel>
</p:dialog>
没有抓到任何例外。只是Jetty在日志中的警告。
4)我试图实现CustomExceptionHandler扩展ExceptionHandlerWrapper并将其添加到faces-config.xml
<factory>
<exception-handler-factory>
online_tests.CustomExceptionHandlerFactory
</exception-handler-factory>
</factory>
如果是大图片,则不会调用handle()方法。只是Jetty在日志中的警告。
5)我尝试实现ErrorHandler,如此处所述 How do I suppress Jetty 8's default ErrorHandler?
在这种情况下,我能够处理请求属性并接收
Throwable throwable = (Throwable) req.getAttribute("javax.servlet.error.exception");
我可以看到,异常的原因是
Caused by: java.lang.IllegalStateException: Form too large: 185992 > 100000
at org.eclipse.jetty.server.Request.extractFormParameters(Request.java:516) ~[jetty-server-9.4.4.v20170414.jar:9.4.4.v20170414]
但是,我仍然不确定如何通知客户端用户该问题。