如何解决rawPassword 不能为空异常
我有以下问题:
我想测试用户是否注册成功。我不是通过 UI 而是通过 Postman 执行此操作。问题是当我使用 POST 命令时出现异常。我已经检查了所有注释。
异常:
java.lang.IllegalArgumentException: rawPassword 不能为空 在 org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder.encode(BCryptPasswordEncoder.java:103) ~[spring-security-core-5.3.3.RELEASE.jar:5.3.3.RELEASE] 在 com.example.application.backend.data.service.UserService.singUpUser(UserService.java:41) ~[classes/:na] 在 com.example.application.backend.data.registration.RegistrationService.register(RegistrationService.java:22) ~[classes/:na] 在 com.example.application.backend.data.registration.RegistrationController.register(RegistrationController.java:18)
这是我的 UserService 类:
private final static String USER_NOT_FOUND_MSG = "user with email %s not found";
@Autowired
private final UserRepository userRepository;
@Autowired
private final BCryptPasswordEncoder bCryptPasswordEncoder;
public UserService(
UserRepository userRepository,BCryptPasswordEncoder bCryptPasswordEncoder) {
this.userRepository = userRepository;
this.bCryptPasswordEncoder = bCryptPasswordEncoder;
}
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
return userRepository.findByEmail(email)
.orElseThrow(() ->
new UsernameNotFoundException(String.format(USER_NOT_FOUND_MSG,email)));
}
public String singUpUser(User user) {
boolean userExists = userRepository.findByEmail(user.getEmail()).isPresent();
if(userExists){
throw new IllegalStateException("email already taken");
}
String encodedPassword = bCryptPasswordEncoder.encode(user.getpassword());
user.setPassword(encodedPassword);
userRepository.save(user);
return "it works";
}
注册服务类:
@Autowired
private final UserService userService;
private final EmailValidator emailValidator;
public String register(RegistrationRequest request) {
boolean isValidEmail = emailValidator.test(request.getEmail());
if (!isValidEmail) {
throw new IllegalStateException("email not valid");
}
return userService.singUpUser(
new User(
request.getFirstName(),request.getLastName(),request.getEmail(),request.getpassword(),UserRole.USER
)
);
}
public RegistrationService(UserService userService,EmailValidator emailValidator) {
this.userService = userService;
this.emailValidator = emailValidator;
}
注册控制器类:
@Autowired
private RegistrationService registrationService;
@PostMapping
public String register(@RequestBody RegistrationRequest request) {
return registrationService.register(request);
}
解决方法
当提供给 bCryptEncoder 的密码字符串为空或 null 时,会发生此错误。
在您的 UserService.java 类中,
String encodedPassword = bCryptPasswordEncoder.encode(user.getPassword());
user.getPassword() 为空,表示在 RegistrationService.java 类中,
request.getPassword()
正在获取一个空值。
请检查您是否从请求对象中获取了正确的密码参数名称。如果可能,请在代码中添加一些记录器语句并进行调试。
,它正在工作。问题是 @Column 注释被设置为可为空的 false。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。