我正在尝试使用Spring 4.2.3和HTML表单实现简单的文件上载。 我有控制器类,它处理整个动作,简单的文件包装类,验证器和简单的视图,表格在HTML& Thymeleaf。 几乎所有东西都运行正常,映射工作正常,视图正在出现。但是当我从磁盘中选择文件并按下上传按钮时,我有NullPointerException。任何人都可以看看并给出一些提示吗?我必须提到我是春天的新手。
控制器:
onProgressUpdate
文件包装器:
@Controller
public class FileUploadController {
private static String UPLOAD_LOCATION = "C:/Temp/";
@Autowired
FileValidator fileValidator;
@InitBinder("file")
protected void initBinderFileBucket(WebDataBinder binder) {
binder.setValidator(fileValidator);
}
@RequestMapping(value = "/upload", method = RequestMethod.GET)
public String getSingleUploadPage(ModelMap model) {
FileBucket fileModel = new FileBucket();
model.addAttribute("fileBucket", fileModel);
return "views/fileUploader";
}
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String singleFileUpload(@Valid FileBucket file, BindingResult result, ModelMap model)
throws IOException {
if (result.hasErrors()) {
System.out.println("File Uploader validation error");
return "views/fileUploader";
} else {
System.out.println("Fetching file"); //prints out in console
MultipartFile multipartFile = file.getFile();
System.out.println(multipartFile.getName()); //NullPointer here
return "views/success";
}
}
}
验证
public class FileBucket {
private MultipartFile file;
//getters & setters + soon other stuff
}
查看:
@Component
public class FileValidator implements Validator {
public boolean supports(Class<?> clazz) {
return FileBucket.class.isAssignableFrom(clazz);
}
public void validate(Object obj, Errors errors) {
FileBucket file = (FileBucket) obj;
if(file.getFile()!=null){
if (file.getFile().getSize() == 0) {
errors.rejectValue("file", "missingfile");
}
}
}
}
堆栈跟踪:
<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
xmlns:th="http://www.thymeleaf.org"
layout:decorator="templates/baseTemplate">
<head>
<title>Upload Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div layout:fragment="contentPanel" class="form-container">
<h1>Simple upload</h1>
<form method="POST" enctype="multipart/form-data" action="upload" >
<input type="file" name="file" /> <br />
<input type="submit" value="Upload" />
</form>
</div>
<a href="/demo">Demo</a>
</body>
</html>
答案 0 :(得分:1)
好的,我发现导致问题的是什么。
在@InitBinder
中更正名称以匹配控制器中的参数后,有必要重命名负责多部分解析的bean。
发件人:强>
@Bean public CommonsMultipartResolver commonsMultipartResolver() {
return new CommonsMultipartResolver();
}
要强>
@Bean public CommonsMultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
否则它无法正常工作。