This is my spring boot v3.10 api, a post request to register user and check if email already exist.
Но я получил эту ошибку: «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) {
// 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.");
}
Это метод, который обрабатывает запрос, чтобы проверить, существует ли электронная почта:
private Integer getEmailCount(String email){
return jdbc.queryForObject(COUNT_USER_EMAIL_QUERY, Map.of("email", email), Integer.class);
}
Как сказано в ошибке, jdbc имеет значение null. Это запрос для переменной COUNT_USER_EMAIL_QUERY: COUNT_USER_EMAIL_QUERY = "SELECT COUNT(*) FROM Users WHERE email = :email";




«jdbc» не вводится как bean-компонент и не инициализируется, поэтому вы получаете исключение NullPointerException. Заменять
public NamedParameterJdbcTemplate jdbc;
с
private final NamedParameterJdbcTemplate jdbc;
Последнее исключение, которое вы получили, по-видимому, связано с чем-то в реализации вашего репозитория при создании пользователя. Возможно, вам придется отлаживать каждую строку и выяснять, где именно она дает сбой. Если вы предоставите полную трассировку стека, я, вероятно, смогу помочь. Не могли бы вы пометить мой ответ как принятый, поскольку он решает исходную проблему?
После серии отладок я смог добраться до чего-то интересного и очень вдохновляющего, хотя у меня еще нет окончательного решения, но у меня есть идея, к чему это меня ведет, я делаю перерыв. Большое спасибо, я очень ценю ваше время для меня, я хотел бы дважды принять ваш ответ.
Я думаю, вы правы, модификатор доступа был на самом деле проблемой. Но после его изменения, которое, как мне кажется, имеет смысл, на самом деле вывести последнее исключение: catch (исключение исключения){} throw new ApiException("Произошла ошибка. Повторите попытку."); что означает, что он не запускает код.