Java.lang.NullPointerException: невозможно вызвать "org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject

 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";

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

«jdbc» не вводится как bean-компонент и не инициализируется, поэтому вы получаете исключение NullPointerException. Заменять

public NamedParameterJdbcTemplate jdbc;

с

private final NamedParameterJdbcTemplate jdbc;

Я думаю, вы правы, модификатор доступа был на самом деле проблемой. Но после его изменения, которое, как мне кажется, имеет смысл, на самом деле вывести последнее исключение: catch (исключение исключения){} throw new ApiException("Произошла ошибка. Повторите попытку."); что означает, что он не запускает код.

Sheriff Sulemana 24.07.2023 22:33

Последнее исключение, которое вы получили, по-видимому, связано с чем-то в реализации вашего репозитория при создании пользователя. Возможно, вам придется отлаживать каждую строку и выяснять, где именно она дает сбой. Если вы предоставите полную трассировку стека, я, вероятно, смогу помочь. Не могли бы вы пометить мой ответ как принятый, поскольку он решает исходную проблему?

SwathiP 24.07.2023 22:44

После серии отладок я смог добраться до чего-то интересного и очень вдохновляющего, хотя у меня еще нет окончательного решения, но у меня есть идея, к чему это меня ведет, я делаю перерыв. Большое спасибо, я очень ценю ваше время для меня, я хотел бы дважды принять ваш ответ.

Sheriff Sulemana 25.07.2023 03:05

Другие вопросы по теме