Spring中JSP通过ModelAttribute传值至控制器报空指针异常求助
咱们先拆解你遇到的空指针异常的核心原因,然后一步步修复:
1. JavaBean规范不匹配导致数据绑定失败
你的ResearchPaper类的getter方法命名不符合JavaBean规范,比如getauthor()、getshortTitle()这种写法是错误的。JavaBean要求getter方法的字段名首字母大写,正确的写法应该是getAuthor()、getShortTitle()。
Spring的@ModelAttribute依赖JavaBean的getter/setter完成数据绑定,如果命名不对,Spring无法把JSP表单里的参数值注入到ResearchPaper对象中,导致Document对象为null,后续调用Document.getauthor()就会直接抛出空指针异常。
修复方法:
把ResearchPaper类的所有getter/setter按照规范修改:
// 示例正确的getter/setter写法 public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getShortTitle() { return shortTitle; } public void setShortTitle(String shortTitle) { this.shortTitle = shortTitle; } // 其他字段的getter/setter以此类推修改
2. JSP表单未使用Spring form标签绑定字段
你当前用的是普通<input>标签,虽然可以通过name属性匹配字段,但结合之前的getter命名问题,更容易出现绑定失败。建议改用Spring的form标签来确保绑定准确:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Add Paper</title> </head> <body> <form:form action="/addResearchPapers" modelAttribute="document"> <p>Author: </p> <form:input path="author" /> <br> <p>Title: </p> <form:input path="title" /> <br> <p>Short Title: </p> <form:input path="shortTitle" /> <br> <!-- 其他字段同样用form:input,path对应ResearchPaper的字段名 --> <input type= "submit" value="Save Paper To Database" /> </form:form> </body> </html>
另外注意:modelAttribute的名称建议用小写(document),符合Java变量命名规范,控制器里的@ModelAttribute也对应改成小写:
public String newResearchPaper(@ModelAttribute("document") ResearchPaper document, BindingResult result, ModelMap model)
3. 仓库保存对象的逻辑错误
你的控制器里写了RPrepo.save(model);,这完全错误!RPrepo应该是继承自JpaRepository<ResearchPaper, ID>的仓库接口,它的save方法需要接收ResearchPaper类型的实体对象,而不是ModelMap。这不仅会导致保存失败,还可能引发额外异常。
修复方法:
直接保存传入的ResearchPaper对象:
RPrepo.save(document);
4. 未检查BindingResult的绑定错误
在使用@ModelAttribute时,应该先检查BindingResult是否有错误,这样可以提前发现数据绑定的问题,避免后续空指针:
@PostMapping("/addResearchPapers") public String newResearchPaper(@ModelAttribute("document") ResearchPaper document, BindingResult result, ModelMap model) { // 先检查绑定错误,比如字段格式不匹配等 if(result.hasErrors()) { // 返回表单页面,提示用户输入错误 return "addPaper"; } // 保存实体到数据库 RPrepo.save(document); // 如果需要把数据带到首页,直接把document放到model里即可 model.addAttribute("document", document); return "homepage"; }
总结空指针的核心原因
ResearchPaper的getter/setter命名不规范,导致Spring无法绑定数据,Document对象为null- 错误地将
ModelMap传入仓库的save方法,而不是实体对象 - 未使用Spring form标签,增加了数据绑定失败的概率
按照上面的步骤修复后,应该就能解决空指针异常,实现表单数据的正确绑定和保存了。
内容的提问来源于stack exchange,提问作者jazzathecutts

