Исключение Java NullPointerException при попытке сохранить / обновить базу данных MySQL через Springboot

#java #spring-boot #hibernate

#java #spring-boot #спящий режим

Вопрос:

Предисловие: Попытка сохранить / обновить базу данных mysql с помощью springboot. Получение исключения нулевого указателя при попытке доступа к классу DaoImpl:

Вот класс сущности:

 import javax.persistence.*;

@Entity
@Table(name="tracker")
public class Tracker {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name="text")
    private String text;

    @Column(name="link")
    private String link;

    public Tracker() {

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

    @Override
    public String toString() {
        return "Tracker{"  
                "id="   id  
                ", text='"   text   '''  
                ", link='"   link   '''  
                '}';
    }
}
 

Вот класс DAO:

 import com.example.Tracker;

import java.util.List;

public interface DAO {

    public List<Tracker> getItems();

    public void saveItems(String text, String link);

    public Tracker getItem(int theId);

    public void deleteItem(int theId);

}
 

Вот класс реализации класса DAO:

 package com.example.tracker.dao;

import com.example.tracker.entity.Tracker;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.List;

@Repository
public class DOAImpl implements DAO{

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public List<Tracker> getItems() {
        //To-Do
        return null;
    }

    @Override
    public void saveItems(String text, String link) {
        Tracker item = new Tracker();
        System.out.println(text);
        System.out.println(link);
        item.setLink(link);
        item.setText(text);
        Session currentSession = sessionFactory.getCurrentSession();
        currentSession.saveOrUpdate(item);
    }

    @Override
    public Tracker getItems(int theId) {
        Session currentSession = sessionFactory.getCurrentSession();
        return null;
    }

    @Override
    public void deleteItem(int theId) {
        //To-Do
    }
}
 

Вот класс, который выполняет эту работу:

 package com.example.WebScrapper;

import com.example.dao.DOAImpl;
import com.example.entity.Tracker;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.IOException;
import java.util.*;

public class itemScraper {
    private String baseURL = "https://www.example-page.com/page/";
    private int page = 1;

    @Autowired
    private DOAImpl itemDOA;

    WebScraper itemScraper = new WebScraper();

    public String getAllPages() throws IOException {
        while(true){
            String webpage = baseURL   page;
            itemScraper.setWebURL(webpage);
            itemScraper.getWebReturn();
            HashMap pageItems = itemScraper.getElements();
            Iterator iterator = pageItems.entrySet().iterator();
            while(iterator.hasNext()){
                Map.Entry currentItem = (Map.Entry) iterator.next();
                itemDOA.saveItems((String) currentItem.getKey(), (String) currentItem.getValue());
                System.out.println("Item Saved");
            }
        }
    }

}
 

При вызове itemDAO.saveItems выдается нулевой указатель. Я проверил, и значение CurrentItem и ключ присутствуют. Но выбрасывается нулевой указатель. Итак, не уверен, почему я получаю эту проблему, любая помощь приветствуется.

Трассировка стека для контекста:

 Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.NullPointerException
    at com.example.WebScrapper.itemScraper.getAllPages(ExampleScraper.java:37)
    at com.example.Application.main(Application.java:17)
    ... 5 more
 

Комментарии:

1. Можете ли вы опубликовать ошибки отслеживания стека?

2. Что такое строка 37 ExampleScraper?

3. Где itemScraper указано как компонент Spring? Возможно, вам просто не хватает @Component этого класса.

4. извините, что говорю это, но ваш код действительно плох. Классы должны начинаться с заглавных букв, а не как itemScraper. Вы создаете экземпляр класса Webscraper внутри вашего класса itemScraper и называете экземпляр itemScraper в качестве содержащего класса.. Сначала вы должны очистить, чтобы людям было легко читать ваш код, если вы хотите получить помощь. Опубликуйте все ваши классы, которые появляются в этой трассировке стека, отметьте номера строк, для которых генерируются исключения..

5. @juwil я тоже собирался это сказать

Ответ №1:

Итак, хотя я не получал никаких ошибок с моим классом HibernateConfig, который настраивал мою фабрику сеансов, после некоторого дополнительного тестирования оказалось, что нулевой указатель был вызван тем, что соединение с базой данных не существовало. Странно, что я получал эту ошибку только после того, как пытался отправить сообщение в базу данных, а не при запуске, когда предполагается создать соединение.