NullPointerException, когда я пытаюсь добавить объект из репозитория jpa в список - PullRequest
1 голос
/ 26 апреля 2020

Я хочу получить все проекты, где person пусто. Каждый раз, когда я вызываю конечную точку, получаю NullPointerException для этой линии emptyProjects.add(project);. Может быть, это из-за JsonBackReference?

И если так, есть ли способ получить список проектов, в которых список людей пуст?

Класс проекта:

package com.example.api.model;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

@Entity
@Table(name = "project")
public class Project {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotNull
    private String name;

    @ManyToMany(mappedBy = "projectList")
    @JsonBackReference
    private List<Person> person;

    public Project(){}

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Person> getPerson() {
        return person;
    }

    public void setPerson(List<Person> person) {
        this.person = person;
    }
}

Метод, над которым я работаю:

@GetMapping("/project/empty")
    public ResponseEntity getEmptyProjects(){
        List <Project> emptyProjects = null;
        for (int i = 0; i <= projectRepo.findAll().size(); i++){
                Project project = projectRepo.findAll().get(i);
                emptyProjects.add(project);
                if (project.getPerson().isEmpty() == true){
                    emptyProjects.add(project);
                }
        }
        return ResponseEntity.ok(emptyProjects);
    }

Спасибо!

Ответы [ 3 ]

2 голосов
/ 26 апреля 2020

Вы не инициализируете список, поэтому у вас возникает исключение NullPointerException, потому что вы пытаетесь вызвать метод для нулевого объекта. Замените эту строку:

List <Project> emptyProjects = null;

на эту

List <Project> emptyProjects = new ArrayList<>();

Более того, нет необходимости вызывать базу данных для каждой итерации l oop. Было бы лучше сохранить результат в списке List<Project> allProjects = projectRepo.findAll() и l oop через этот список для лучшей производительности

1 голос
/ 26 апреля 2020

Как упомянул @Germano Mosconi, вам придется инициализировать emptyProjects .

  // Fetch all projects
  List<Project> allProjects = projectRepo.findAll();

  // Initialize empty project list here
  List<Project> emptyProjects = new ArrayList<>();

  // Filter projects having empty person.
  for (Project project : allProjects) {
    if (null == project.getPerson()) {
      emptyProjects.add(project);
    }
  }
1 голос
/ 26 апреля 2020

Ваш список объявлен как нулевой, означает, что для этого emptyProjects адрес памяти не назначен, поэтому при доступе к нему вы получаете ошибку NPE. Более того, в вашем состоянии l oop и доступе к элементам findAll() resultSet вы без необходимости вызываете этот метод несколько раз, что не совсем нормально, а проверка вашего состояния for (int i = 0; i <= projectRepo.findAll().size(); i++){ неверна. проверьте исправленный код:

@GetMapping("/project/empty")
    public ResponseEntity getEmptyProjects(){
        List <Project> emptyProjects = new ArrayList<>();
        List <Project> resultSet=projectRepo.findAll();
        for (int i = 0; i < resultSet.size(); i++){
                Project project = resultSet.get(i);
                emptyProjects.add(project);
                if (project.getPerson().isEmpty() == true){
                    emptyProjects.add(project);
                }
        }
        return ResponseEntity.ok(emptyProjects);
    }
...