Wicket 在后续请求中报告相同的 FileUpload 对象
Posted
技术标签:
【中文标题】Wicket 在后续请求中报告相同的 FileUpload 对象【英文标题】:Wicket reporting same FileUpload object in subsequent requests 【发布时间】:2022-01-23 04:42:47 【问题描述】:我在我们正在开发的应用程序的多个页面中使用了一个面板。在这个面板中是一个 FileUploadField,它在“更改”时使用 AjaxFormSubmitBehavior(扩展为 FileUploadBehavior)来上传文件,然后我通过 ajax 添加到列表中,更新视图,清除 FileUploadField,然后允许他们选择另一个文件。事实上,这正是在使用面板的一个页面中发生的情况......但在另一个页面中却没有。在非工作页面中,无论在第一个文件之后选择什么文件,都会一遍又一遍地重复选择的第一个文件。
在行为的 onSubmit 中,我们得到了 FileUpload 对象,该对象在请求之间应该是不同的。我可以在调试器中看到 FileUpload 是与前一个请求完全相同的对象,而不仅仅是携带相同的有效负载。
我正在仔细检查两个页面上面板的使用情况,没有发现任何实质性差异。当我坐在服务器上的断点处时,我可以看到页面上的文件控件确实显示了更改的文件名(所以我怀疑发生了什么问题是在 java 端)。但我无法弄清楚为什么他们的行为会有所不同,或者看不出哪里出了问题。面板和页面又大又复杂,所以这里是相关部分的 sn-ps。
FileUploadBehavior.onSubmit(AjaxRequestTarget):
FileUploadField fileUploadField = (FileUploadField) fileUploadContainer.get("fileUploadField");
FileUpload fileUpload = fileUploadField.getFileUpload();
[...]
//clear file input after each request for next upload.
fileUploadField.clearInput();
target.add(fileUploadField);
我在这一行之后休息了一下,可以看到第一个文件被重复了。实例化面板中的字段和行为的代码如下所示:
FileUploadField fileUploadField = new FileUploadField("fileUploadField");
fileUploadField.add(new FileUploadBehavior("change", maxFileSize).setDefaultProcessing(false));
fileUploadContainer.add(fileUploadField);
html 标签:
我觉得它在一个页面中而不是在另一个页面中工作的事实让我认为问题在面板之外。浏览器中的控件在测试期间显示第二个文件名的事实使我认为它在 java 端。但是关于文件事件或定义的任何事情都不会发生在面板本身之外。表单元素声明相同,并且在页面呈现时都具有多部分编码类型。两者都成功上传了他们的第一个文件。我什至不确定在哪里可以找到为什么 wicket 在一个页面中重用 FileUpload 对象,而在另一个页面中却没有。
我应该提到我们使用 Apache Wicket 6.26。
更新:我查看了 FileUploadField 的来源,它明确检查了 FileUploads 在其内部属性中是否为空,如果是,则返回它而不检查实际请求。我看不到任何方法可以在请求之间清除此值。 clearInput() 不会影响我所看到的。我对这是如何在一页中工作而不是为什么它不在现在没有的页面中更感到困惑。我也不知道如何在请求之间“重置”类。
【问题讨论】:
关于您的update
:fileUploads
字段在#onDetach() 中为空:github.com/apache/wicket/blob/wicket-6.x/wicket-core/src/main/…
【参考方案1】:
好的,想通了。正如 martin-g 所指出的,在 onDetach() 中将 fileUploads 设置为 null,这是我在更新后大约一小时发现的。问题是 onDetach() 首先尝试使模型对象无效。但是该方法失败了,因为附加到复合属性模型的表单上的模型上没有方法“fileUploadField”。有效的页面不使用表单的复合属性模型。出于某种原因,当这个错误发生时,它被吞没在调用堆栈的某个地方,并没有出现在我的控制台日志中。
我的解决方案是为 fileUploadField 提供一个本地模型,因为这不是我与控件交互的方式(我每次都使用 ajax 并直接获取 FileUpload)。那解决了它。它现在无处不在。
【讨论】:
以上是关于Wicket 在后续请求中报告相同的 FileUpload 对象的主要内容,如果未能解决你的问题,请参考以下文章