Spring Boot+Hibernate中Spring Security加密密码存储遇空值错误排查
解决BCryptPasswordEncoder抛出"rawPassword cannot be null"异常的问题
嘿,我完全理解你被这个问题困扰三天的心情!咱们直接来搞定它——这个异常的核心原因很明确:你调用passwordEncoder.encode()时传入了null值,也就是customer.getPassword()没有拿到用户输入的密码。下面是一步步排查和解决的方案:
1. 先确认请求方式与参数绑定是否正确
你的控制器方法只指定了@RequestMapping(value="/registerNewCustomer"),但没有限定请求方法。注册表单应该用POST提交数据,而如果是GET请求的话,Spring MVC可能无法正确绑定表单里的密码字段,导致customer.getPassword()返回null。
修改控制器的注解,明确指定POST方法:
@RequestMapping(value="/registerNewCustomer", method = RequestMethod.POST) public String showCustomerRegistration(Customer customer) { // 先加个非空判断,避免后续报错 if (customer.getPassword() == null || customer.getPassword().trim().isEmpty()) { // 这里可以返回错误页面或者抛出友好异常,提示用户必须输入密码 return "register-error"; } customer.setPassword(passwordEncoder.encode(customer.getPassword())); customerService.saveCustomer(customer); return "customer"; }
2. 检查前端表单的字段名是否匹配
确保你前端注册表单里的密码输入框的name属性和Customer类中的password字段完全一致。比如:
<input type="password" name="password" placeholder="请输入密码">
如果前端的name是pwd或者其他名字,Spring MVC就无法把值绑定到customer.password上,自然会是null。
3. 验证Customer类的getter/setter方法
一定要确认Customer类里的password字段有正确的getPassword()和setPassword()方法,Spring MVC依赖这些方法来完成属性绑定。比如:
public class Customer { private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } // 其他字段和方法... }
4. 临时调试排查
如果还是不确定问题出在哪,可以在控制器方法里加一行日志或者打印语句,看看customer.getPassword()的值到底是什么:
System.out.println("用户输入的密码:" + customer.getPassword());
这样能直观判断是参数没传过来,还是其他环节出了问题。
按照这些步骤排查,应该就能解决这个空指针异常啦!
内容的提问来源于stack exchange,提问作者user14477296
相关产品推荐
相关产品推荐

