简体   繁体   English

Spring MVC中的文件上传给出了NullPointerException

[英]File upload in Spring MVC gives NullPointerException

I have a simple JSP form as follows: 我有一个简单的JSP表单如下:

<p>Please select a file and <i>click</i> <i>Upload file</i> to upload the file to the server:</p>
    <c:url value="/upload/display" var="displayUploadedFileURL" />                   
    <form:form action="${displayUploadedFileURL}" method="post" modelAttribute="upload" enctype="multipart/form-data">            
        <input type="file" name="file" />                       
        <input type="submit" value="Upload file" />&nbsp;<form:errors path="file" />
        <input type="Reset" value="Reset">           
    </form:form>         

Which is for a user to upload a file to the server. 这是供用户将文件上传到服务器的。 The controller's method is as follows: 控制器的方法如下:

@Controller
@RequestMapping("/upload")
public class UploadController {

@Autowired
private UploadValidator uploadValidator; 



    @RequestMapping(value="/display", method=RequestMethod.POST)
    public String displayUploadedFile(@ModelAttribute("upload") Upload upload,
                                      BindingResult bindingResult,
                                      Model model) {                

        // Validate Upload.
        uploadValidator.validate(upload, bindingResult);
        if (bindingResult.hasErrors()) {  
            return ("view/upload/select");  
        }
        else {
            String fileName = upload.getFile().getOriginalFilename();
            System.out.println("Here: " + upload.getFile().getOriginalFilename());            
            model.addAttribute("fileName", fileName);
            return ("view/upload/display");
       }       
   }  

... ...

But when I select a file and use the Upload file button I get the following: 但是当我选择一个文件并使用上传文件按钮时,我得到以下内容:

Your page request has caused a NullPointerException: error:

library.validator.UploadValidator.validate(UploadValidator.java:29)
library.controller.upload.UploadController.displayUploadedFile(UploadController.java:45)

The validator concerned is very simple: 有关的验证人很简单:

package library.validator;

import library.model.Upload;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

@Component
public class UploadValidator implements Validator {

private static final Logger logger = Logger.getLogger(UploadValidator.class);   

public UploadValidator() {
}

@Override
public boolean supports(Class cls) {
    return Upload.class.isAssignableFrom(cls);
}

@Override
public void validate(Object target, Errors errors) {
    logger.info(UploadValidator.class.getName() + ".validate() method called.");  

    Upload upload = (Upload) target;
    if (upload.getFile().getSize() == 0) {
        errors.rejectValue("file", "file.required");
    }       
}            

} }

I have all the relevant .jar files in the application's .lib folder, and I'mincluding the following: 我在应用程序的.lib文件夹中包含所有相关的.jar文件,并且我将包括以下内容:

<bean id="uploadValidator" class="library.validator.UploadValidator" />        

<!-- Spring multipartResolver. -->         
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />  

In the DispatcherServlet . DispatcherServlet

The Upload object type is as follows: Upload对象类型如下:

import org.springframework.web.multipart.MultipartFile;

public class Upload {

    private MultipartFile file;

And appropriate getter and setter. 适当的吸气剂和固定剂。

So why is my code not working? 那为什么我的代码不起作用?

Stacktrace for current problem, ie allowing for changes to controller method in answer below, is: 针对当前问题的Stacktrace,即允许在下面的答案中更改控制器方法,是:

org.springframework.util.Assert.notNull(Assert.java:112) org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.resolveName(RequestParamMethodArgumentResolver.java:171) org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:89) org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:79) org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) org.sp org.springframework.util.Assert.notNull(Assert.java:112)org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.resolveName(RequestParamMethodArgumentResolver.java:171)org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument( AbstractNamedValueMethodArgumentResolver.java:89)org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:79)org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157)org.springframework。 web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124)org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)org.springframework.web.servlet.mvc。 method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)org.sp ringframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) javax.servlet.http.HttpServlet.service(HttpServlet.java:641) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) org.apa ringframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)org.springframework.web。 servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)org。 springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)javax.servlet.http.HttpServlet.service(HttpServlet.java:641)org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:722)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 210)org.apa che.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) java.util.conc che.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java: 498)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)org.apache.catalina.valves.AccessLogValve.invoke( AccessLogValve.java:562)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)org.apache.coyote.http11。 Http11Processor.process(Http11Processor.java:243)org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:188)org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:166) org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:302)java.util.conc urrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) java.lang.Thread.run(Thread.java:744) urrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)java.lang.Thread.run(Thread.java:744)

Configuring the multipartResolver bean is important thing, but also you should check that your .xml config file with this bean is imported in your general applicationContext.xml , if you have some. 配置multipartResolver bean很重要,但是如果你有一些,你应该检查你的.xml配置文件是否在你的常规applicationContext.xml导入。 I had same problem and this did the thing. 我遇到了同样的问题,这就完成了。

This has now been solved. 这已经解决了。 The problem was that the following was incorrectly defined in the DispatcherServlet : 问题是在DispatcherServlet错误地定义了以下内容:

<!-- Spring multipartResolver. -->         
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM