使用Spring MVC的简单文件上载形式的NullPointerException

时间:2016-04-23 09:48:54

标签: java spring spring-mvc file-upload nullpointerexception

我正在尝试使用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>

1 个答案:

答案 0 :(得分:1)

好的,我发现导致问题的是什么。 在@InitBinder中更正名称以匹配控制器中的参数后,有必要重命名负责多部分解析的bean。

发件人:

@Bean public CommonsMultipartResolver commonsMultipartResolver() { 
    return new CommonsMultipartResolver(); 
}

@Bean public CommonsMultipartResolver multipartResolver() { 
    return new CommonsMultipartResolver(); 
}

否则它无法正常工作。