Spring Boot银行应用注册时出现Entity must not be null错误求助
问题:Spring Boot银行Web应用注册表单提交失败报错
我正在开发一个基于Spring Boot、Hibernate、MySQL的银行Web应用,启动应用访问http://localhost:8080/并填写完注册表单提交后,IntelliJ中出现报错,表单提交失败。
报错信息
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Entity must not be null.; nested exception is java.lang.IllegalArgumentException: Entity must not be null. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ...(省略中间栈信息) Caused by: java.lang.IllegalArgumentException: Entity must not be null. at org.springframework.util.Assert.notNull(Assert.java:201) ...(省略中间栈信息)
application.properties配置
数据库已创建且配置完成,连接正常。
UserController代码
package com.userfront.controller; import java.security.Principal; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.userfront.domain.User; import com.userfront.service.UserService; @Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/profile", method = RequestMethod.GET) public String profile(Principal principal, Model model) { User user = userService.findByUsername(principal.getName()); model.addAttribute("user", user); return "profile"; } @RequestMapping(value = "/profile", method = RequestMethod.POST) public String profilePost(@ModelAttribute("user") User newUser, Model model) { User user = userService.findByUsername(newUser.getUsername()); user.setUsername(newUser.getUsername()); user.setFirstName(newUser.getFirstName()); user.setLastName(newUser.getLastName()); user.setEmail(newUser.getEmail()); user.setPhone(newUser.getPhone()); model.addAttribute("user", user); userService.saveUser(user); return "profile"; } }
RequestFilter代码
package com.userfront.config; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component @Order(Ordered.HIGHEST_PRECEDENCE) public class RequestFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { HttpServletResponse response = (HttpServletResponse) res; HttpServletRequest request = (HttpServletRequest) req; response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200"); response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Credentials", "true"); if (!(request.getMethod().equalsIgnoreCase("OPTIONS"))) { try { chain.doFilter(req, res); } catch(Exception e) { e.printStackTrace(); } } else { System.out.println("Pre-flight"); response.setHeader("Access-Control-Allow-Methods", "POST,GET,DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "authorization, content-type," + "access-control-request-headers,access-control-request-method,accept,origin,authorization,x-requested-with"); response.setStatus(HttpServletResponse.SC_OK); } } public void init(FilterConfig filterConfig) {} public void destroy() {} }
问题分析与解决方案
核心问题
注册表单的请求被错误发送到了/user/profile接口——这个接口是用户信息更新逻辑,而非注册逻辑:
- 注册时新用户名在数据库中不存在,
userService.findByUsername(newUser.getUsername())返回null - 后续对
null对象调用setXXX方法会触发空指针,最终调用userService.saveUser(user)时传入null,触发Entity must not be null报错
修复步骤
新增注册专用接口
在UserController中添加注册POST接口,直接处理新用户保存:@RequestMapping(value = "/register", method = RequestMethod.POST) public String registerPost(@ModelAttribute("user") User newUser, Model model) { // 先校验用户名是否已存在 if (userService.findByUsername(newUser.getUsername()) != null) { model.addAttribute("error", "用户名已存在,请更换"); return "register"; // 返回注册页面提示错误 } userService.saveUser(newUser); return "redirect:/login"; // 注册成功后跳转到登录页 }调整注册表单提交路径
修改注册页面的form标签,将action属性设置为/user/register,确保请求发送到正确的接口。检查UserService的save逻辑
确认userService.saveUser()方法能正确处理新用户的保存(比如使用JPA的save()方法,会自动区分新增和更新),避免仅支持更新的逻辑。优化跨域配置(可选)
若注册页面是Spring Boot自带的模板(如Thymeleaf),当前跨域配置允许的是http://localhost:4200,可能和应用实际运行的8080端口冲突,可以调整为:response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");或者移除跨域Filter(如果不需要前后端分离跨域)。
内容的提问来源于stack exchange,提问作者bilal sajai
相关产品推荐
相关产品推荐

