You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中JSP通过ModelAttribute传值至控制器报空指针异常求助

解决Spring中@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:18:15