#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, который настраивал мою фабрику сеансов, после некоторого дополнительного тестирования оказалось, что нулевой указатель был вызван тем, что соединение с базой данных не существовало. Странно, что я получал эту ошибку только после того, как пытался отправить сообщение в базу данных, а не при запуске, когда предполагается создать соединение.