Apache上传组件报空指针异常:org.springframework.web.util.NestedServletException,java.lang.NullPointerException

好久没有写过表单上传组件了,今天在使用Apache组件测试文件上传的时候,出现了空指针异常,测试代码如下:

@Controller
public class FileUploadController {
    
    

	@Autowired
	private ServletContext servletContext;
	
	@RequestMapping("/save")
	public ModelAndView save(Employee emp,MultipartFile pic) {
    
    
		System.out.println(emp);
		String fileName=pic.getOriginalFilename();
		System.out.println(fileName);
		String saveDir = servletContext.getRealPath("/upload");
		System.out.println(saveDir);
		return null;
	}
}

检查了一下我的xml配置:

<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="maxUploadSize" value="1048576"/>
	</bean>

没问题,接下来看看domain类的字段和jsp页面中表单的name是否对应:

@Data
public class Employee {
    
    

	private Long id;
	private String username;
	private String password;
	private Integer age;
	@DateTimeFormat(pattern="yyyy-MM-dd")
	private Date hiredate;
}
<form action="/save" method="POST" enctype="multipart/form-data">
		姓名<input type="text" name="username"><br>
		年龄<input type="text" name="age"><br>
		文件<input type="file" name="pic"><br>
		<input type="submit" value="提交">
</form>

仔细对照发现还是没问题,不死心,再跑一遍:
在这里插入图片描述
点击提交,报出异常:
在这里插入图片描述
说是第22行空指针,再看命令行打印出的employee对象:
在这里插入图片描述在这里插入图片描述
发现该对象的所有字段都为空,很懵逼表单的数据为什么没有封装进来,接下来将表单的enctype改为"application/x-www-form-urlencoded":

<form action="/save" method="POST" enctype="application/x-www-form-urlencoded">
		姓名<input type="text" name="username"><br>
		年龄<input type="text" name="age"><br>
		文件<input type="file" name="pic"><br>
		<input type="submit" value="提交">
</form>

测试方法去掉多余的参数:

@Controller
public class FileUploadController {
    
    

	@Autowired
	private ServletContext servletContext;
	
	@RequestMapping("/save")
	public ModelAndView save(Employee emp) {
    
    
		System.out.println(emp);
		String saveDir = servletContext.getRealPath("/upload");
		System.out.println(saveDir);
		return null;
	}
}

发现可以接收到表单数据:
在这里插入图片描述
这就说明了问题的所在应该是xml中配置的Apache文件上传解析没起作用,
于是不停的百度,还是找不到答案,抓狂,冷静下来突然想到该组件在配置bean的时候好像一定要加id属性,并且一定要将id的值设置为"multipartResolver"

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<property name="maxUploadSize" value="1048576"/>
</bean>

重启服务器,提交表单,成功!
在这里插入图片描述
晕死,原来是一个不起眼的id让人折腾了大半天,以后写文件上传组件一定要记住这个细节

猜你喜欢

转载自blog.csdn.net/iwlnner/article/details/103064561