java – 为什么Spring MVC将空对象插入应该是空列表?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么Spring MVC将空对象插入应该是空列表?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2986字,纯文字阅读大概需要5分钟。
内容图文
![java – 为什么Spring MVC将空对象插入应该是空列表?](/upload/InfoBanner/zyjiaocheng/824/e6359c4fa729490a922b6a3fd66f0e98.jpg)
我正在上传多个文件.当我实际选择要上传的文件时,这很好用;他们很好地进入他们的列表,但是当我点击上传而不选择文件时,我得到一个包含空文件的List.我的验证器正在检查此List的大小是否为0,因此它会超过它.
是的,我可以解决它只是检查一个空文件,是的我可以在没有选择文件时禁用上传按钮,但我想知道为什么Spring会这样做,可能还有如何阻止它这样做.
这是jsp:
<form:form commandName="documentsBean" enctype="multipart/form-data">
<input type="hidden" name="submittedFormAction" value="attachDocumentSave"/>
<input type="file" name="files" id="attachFiles" multiple/>
<button type="submit">Attach</button>
</form:form>
豆子,没什么特别的:
public class DocumentsBean
{
private List<MultipartFile> files;
public List<MultipartFile> getFiles(){
return files;
}
public void setFiles(List<MultipartFile> files){
this.files = files;
}
}
控制器:
@RequestMapping( method = RequestMethod.POST, params = { "submittedFormAction=attachDocumentSave" })
public ModelAndView attachDocumentSave(HttpServletRequest request, @ModelAttribute("documentsBean") DocumentsBean documentsBean, BindingResult errors) throws Exception
{
// At this point documentsBean.files is an ArrayList<E> with size = 1
}
当我深入研究documentsBean.files时,我看到elementData [0]是一个CommonsMultipartFile,它的fileName是一个空字符串,其大小为0.
到底是怎么回事?
解决方法:
这是你的解决方案.解释如下.
添加一个设置以下属性的@InitBinder方法.理想情况下,您可以将其添加到@ControllerAdvice类,但具有相应@RequestMapping方法的控制器也可以.
@InitBinder
public void init(WebDataBinder binder) {
binder.setBindEmptyMultipartFiles(false);
}
您还需要像这样更改DocumentsBean类
private List<MultipartFile> files = Arrays.asList();
这样该字段不为空.
Spring使用ServletModelAttributeMethodProcessor为像你这样的@ModelAttribute注释参数生成一个参数
@ModelAttribute("documentsBean") DocumentsBean documentsBean
这个HandlerMethodArgumentResolver使用请求(及其表单参数)通过将参数绑定到实例类来生成参数类型的实例.
实例字段.如果它检测到请求的内容类型为multipart / form-data,则它将执行特殊绑定.
此绑定在WebDataBinder#bindMultipart(..)中完成.它检索由MulitpartResolver创建的所有MultipartFile对象.如果只有一个,它会检查两件事.
if (isBindEmptyMultipartFiles() || !value.isEmpty()) {
mpvs.add(key, value);
}
第一个方法调用
Return[s] whether to bind empty
MultipartFile
parameters.
第二个检查MultipartFile是否有任何正文内容.如果您在未选择文件的情况下提交表单(或者您选择了空文件AFAIK),则不会.
如果这些表达式中的任何一个解析为true,那么Spring将为您的处理程序方法提供此空的MultipartFile持有者.否则,它不会绑定该字段,这就是你想要一个默认值的原因(因此它不会保持为null)
private List<MultipartFile> files = Arrays.asList();
看一下WebDataBinder#setBindEmptyMultipartFiles(boolean)的javadoc
Set whether to bind empty MultipartFile parameters. Default is “true”.
Turn this off if you want to keep an already bound MultipartFile when
the user resubmits the form without choosing a different file. Else,
the already bound MultipartFile will be replaced by an empty
MultipartFile holder.
这是您应该在上面显示的@InitBinder方法中设置为false的属性.
内容总结
以上是互联网集市为您收集整理的java – 为什么Spring MVC将空对象插入应该是空列表?全部内容,希望文章能够帮你解决java – 为什么Spring MVC将空对象插入应该是空列表?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。