当我试图从jpa仓库中添加一个对象到列表中时,出现NullPointerException异常。

问题描述 投票:0回答:2

我想得到所有项目,其中 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);
    }

谢谢!

spring-boot api jpa nullpointerexception spring-repositories
2个回答
2
投票

你没有初始化列表,所以你有一个NullPointerException,因为你试图在一个空对象上调用一个方法。替换这一行。

List <Project> emptyProjects = null;

替换成这行:

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

此外,没有必要在每次循环迭代时调用数据库。最好是将结果保存在一个列表中。List<Project> allProjects = projectRepo.findAll() 并在此列表中循环以获得更好的性能


1
投票

你的列表被声明为空意味着没有为该列表分配内存地址。emptyProjects所以,当你访问它时,你得到的是 NPE 错误。此外,在你的循环条件中,访问元素的 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);
    }

1
投票

正如@Germano Mosconi所提到的,你必须初始化... 空项目.

  // 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);
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.