Как исправить java.lang.NullPointerException при вызове JpaRepository из другого класса? - PullRequest
0 голосов
/ 10 апреля 2019

Я новый разработчик Java. При запуске Spring Project с двумя кейсами:
- Создайте другой основной и вызовите метод JpaRepository.
- Из controller.impl я вызываю метод класса с использованием метода JpaRepository.

Я получил ошибку:

java.lang.NullPointerException
    at solution.Testclass.getvalue(Testclass.java:20)
    at mydemo.controller.testmain.main(testmain.java:11)

Я пытался добавить много обозначений, но это не работает.

Вот мой код.

Main:

package mydemo.controller;


import solution.Testclass;

public class testmain {

    public static void main(String[] args) {

        Testclass testclass = new Testclass();
        testclass.getvalue();
    }

}

Testclass.java:

package solution;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import mydemo.entity.HistoryUpload;
import mydemo.repository.HistoryUploadRepository;

public class Testclass {

    @Autowired HistoryUploadRepository historyUploadRepository;

    List<HistoryUpload> listHistoryUploadNullFlag;


    public List<HistoryUpload> getvalue(){

        try {

            this.listHistoryUploadNullFlag = historyUploadRepository.findAll();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return this.listHistoryUploadNullFlag;
    }
}

Мой репозиторий:

package mydemo.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import mydemo.entity.HistoryUpload;

public interface HistoryUploadRepository extends JpaRepository<HistoryUpload, Integer>{

//  List<HistoryUpload> findByStatus(String p_status);

//  @Query(value = "SELECT o.* FROM history_upload o where o.status = ?1 AND o.flag_synchronize is null",nativeQuery = true)
//  List<HistoryUpload> findByStatusAndNullFlagSynchronize(String p_status);

}

И моя сущность

package mydemo.entity;

import java.sql.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;


@Entity
@Table(name="history_upload")
@Data
public class HistoryUpload {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private Integer logFileId;
    private Integer flagSynchronize;
    private Integer instance_id;
    private String instanceName;
    private Date uploadTime;
    private String status;
}

Пожалуйста, помогите мне! Спасибо за чтение.

1 Ответ

0 голосов
/ 10 апреля 2019

Похоже, вы не запускаете ваше приложение как приложение с начальной загрузкой, которое не позволяет создавать компоненты в вашем хранилище, что приводит к исключению нулевого указателя при попытке вызвать метод хранилища getAll()

Это может быть добавлено в ваш основной класс следующим образом:

@SpringBootApplication(scanBasePackages = *your base package, eg com.test.application*) // this is not essential but required if you use a non standard directory structure
public class TestMain {

    public static void main(String[] args) {
       SpringApplication.run(TestMain.class, args);
// you will now need to access your test class through a spring bean - see below for an example using a controller endpoint:
    }

}

// in TestController
@RestController
class TestController {

    private final Testclass testClass;

    @Autowired
    public TestController(TestClass testClass) {
        this.testCLass = testClass
    }


    // now a simple endpoint to get the data, call this in postman to see the result

     @GetMapping(value = "/")
     public ResponseEntity<List<HistoryUpload>> getHsitoryList() {
         return new ResponseEntity.ok().body(TestClass.getvalue());
     }

}

Также избегайте перехвата общих исключений в вашем блоке try catch, как правило, это плохая практика в соответствии со стандартом java-сертификата, особенно когда вы перехватываете NullPointerExceptions (их никогда не поймать, читайте подробнее здесь )

Также в будущем рассмотрите возможность ведения журналов, так как вызов трассировки стека e.print может быть дорогим для производительности, плюс регистраторы предлагают больше настроек, читайте здесь

Я бы посоветовал изучить использование специального класса обработчика исключений, вы можете прочитать о них здесь

Примечание:

Springможет быть привередливым, когда дело доходит до структуры каталогов, убедитесь, что все компоненты (контроллеры, репозиторий, сервисы и т. д.)в каталогах ниже основное приложение:


com
   your
       app
          Main.java
          controller / your controllers
          repositories / your repos
 ....       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...