英文:
java.lang.NullPointerException: Cannot invoke "org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject
问题
这是我的Spring Boot v3.10 API,用于进行用户注册的POST请求,并检查电子邮件是否已经存在。但是我收到了以下错误信息:“java.lang.NullPointerException: 无法调用“org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(String, java.util.Map, java.lang.Class)”因为“this.jdbc”为空”。
这是创建新用户的类,但在创建用户之前,它使用getEmailCount()方法检查用户表中是否已经存在电子邮件,但这是我遇到错误的地方。
@Repository
@RequiredArgsConstructor
@Slf4j
public class UserRepositoryImplementation implements UserRepository<User> {
public NamedParameterJdbcTemplate jdbc;
private final RoleRepository<Role> roleRepository;
private final BCryptPasswordEncoder encoder;
@Override
public User create(User user) {
// 检查电子邮件是否唯一
if (getEmailCount(user.getEmail().trim().toLowerCase()) > 0) {
throw new ApiException("电子邮件已在使用中,请使用不同的电子邮件地址重试。");
}
// 保存新用户
try {
KeyHolder holder = new GeneratedKeyHolder();
SqlParameterSource parameters = getSqlParameterSource(user);
jdbc.update(INSERT_USER_QUERY, parameters, holder);
user.setId(requireNonNull(holder.getKey()).longValue());
// 向用户添加角色
roleRepository.addRoleToUser(user.getId(), ROLE_USER.name());
// 发送验证URL
String verificationUrl = getVerificationUrl(UUID.randomUUID().toString(), ACCOUNT.getType());
// 在验证表中保存URL
jdbc.update(INSERT_VERIFICATION_QUERY, Map.of("userId", user.getId(), "url", verificationUrl));
// 向用户发送带有验证URL的电子邮件
//emailSerivice.sendVerificationUrl(user.getFirstName(), user.getEmail(), verificationUrl, ACCOUNT);
user.setEnabled(false);
user.setNotLocked(true);
// 返回新创建的用户
return user;
// 如果有任何错误,抛出带有适当消息的异常
} catch (Exception exception) {
}
throw new ApiException("发生错误,请重试。");
}
}
这是处理查询以检查电子邮件是否已存在的方法:
private Integer getEmailCount(String email) {
return jdbc.queryForObject(COUNT_USER_EMAIL_QUERY, Map.of("email", email), Integer.class);
}
如错误所述,jdbc为空。以下是COUNT_USER_EMAIL_QUERY变量的查询:
COUNT_USER_EMAIL_QUERY = "SELECT COUNT(*) FROM Users WHERE email = :email";
请确保在 UserRepositoryImplementation 类中正确初始化 NamedParameterJdbcTemplate(jdbc)以解决这个问题。
英文:
This is my spring boot v3.10 api, a post request to register user and check if email already exist.
But i got this error: "java.lang.NullPointerException: Cannot invoke "org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(String, java.util.Map, java.lang.Class)" because "this.jdbc" is null"
this is the class that creates a new user but before creating it checks if an email already exist in the user table with the getEmailCount() method but this where i get the error.
@Repository
@RequiredArgsConstructor
@Slf4j
public class UserRepositoryImplementation implements UserRepository<User> {
public NamedParameterJdbcTemplate jdbc;
private final RoleRepository<Role> roleRepository;
private final BCryptPasswordEncoder encoder;
@Override
public User create(User user) {
// check if email is unique
if(getEmailCount(user.getEmail().trim().toLowerCase()) > 0) {
throw new ApiException("Email already in use. Please use a different email and try again.");
}
// save new user
try{
KeyHolder holder = new GeneratedKeyHolder();
SqlParameterSource parameters = getSqlParameterSource(user);
jdbc.update(INSERT_USER_QUERY, parameters, holder);
user.setId(requireNonNull(holder.getKey()).longValue());
// add role to the user
roleRepository.addRoleToUser(user.getId(), ROLE_USER.name());
// send verification URL
String verificationUrl = getVerificationUrl(UUID.randomUUID().toString(), ACCOUNT.getType());
// save URL in verification table
jdbc.update(INSERT_VERIFICATION_QUERY, Map.of("userId", user.getId(), "url", verificationUrl));
// send email to user with verification URL
//emailSerivice.sendVerificationUrl(user.getFirstName(), user.getEmail(), verificationUrl, ACCOUNT);
user.setEnabled(false);
user.setNotLocked(true);
// return the newly created user
return user;
// if any errors, throw exception with proper message
}catch (Exception exception){}
throw new ApiException("An error occurred. Please try again.");
}
This is the method that handles the query to check if the email already exist:
private Integer getEmailCount(String email){
return jdbc.queryForObject(COUNT_USER_EMAIL_QUERY, Map.of("email", email), Integer.class);
}
As error said the jdbc is null.
This the query for the COUNT_USER_EMAIL_QUERY variable: COUNT_USER_EMAIL_QUERY = "SELECT COUNT(*) FROM Users WHERE email = :email";
答案1
得分: 0
"jdbc"没有被注入为一个Bean,也没有被初始化,因此您会得到NullPointerException。用以下代码替换:
private final NamedParameterJdbcTemplate jdbc;
英文:
"jdbc" is not injected as a bean and not initialized, therefore you are getting NullPointerException. Replace
public NamedParameterJdbcTemplate jdbc;
with
private final NamedParameterJdbcTemplate jdbc;
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论