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

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接口——这个接口是用户信息更新逻辑,而非注册逻辑:

  1. 注册时新用户名在数据库中不存在,userService.findByUsername(newUser.getUsername())返回null
  2. 后续对null对象调用setXXX方法会触发空指针,最终调用userService.saveUser(user)时传入null,触发Entity must not be null报错

修复步骤

  1. 新增注册专用接口
    在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"; // 注册成功后跳转到登录页
    }
    
  2. 调整注册表单提交路径
    修改注册页面的form标签,将action属性设置为/user/register,确保请求发送到正确的接口。

  3. 检查UserService的save逻辑
    确认userService.saveUser()方法能正确处理新用户的保存(比如使用JPA的save()方法,会自动区分新增和更新),避免仅支持更新的逻辑。

  4. 优化跨域配置(可选)
    若注册页面是Spring Boot自带的模板(如Thymeleaf),当前跨域配置允许的是http://localhost:4200,可能和应用实际运行的8080端口冲突,可以调整为:

    response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
    

    或者移除跨域Filter(如果不需要前后端分离跨域)。

内容的提问来源于stack exchange,提问作者bilal sajai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:39:54