首页 > 解决方案 > NullPointerException:尝试执行 MongoDB FindByID 时为 null

问题描述

所以我试图将java spring连接到mongoDB并使用findById,但它总是给出空指针错误。

2020-08-04 13:54:01.893 ERROR 8312 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

java.lang.NullPointerException: null
    at pt.project.ProvaConceito_BackEnd.mongoDB.UserService.findById(UserService.java:29) ~[classes/:na]
    at pt.project.ProvaConceito_BackEnd.mongoDB.mongoDBService.getUserByID(mongoDBService.java:19) ~[classes/:na]

这个项目的结构是:

我将分享我现在拥有的代码:

mongoDBService

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pt.project.ProvaConceito_BackEnd.pojos.User;

@RestController
@CrossOrigin(origins="http://localhost:4200")
public class mongoDBService {

    UserService userService = new UserService();

    @RequestMapping("/concept/user")
    public User getUserByID(Integer id) {
        return userService.findById(1);
    }
}

用户服务

package pt.project.ProvaConceito_BackEnd.mongoDB;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pt.project.ProvaConceito_BackEnd.pojos.User;
import pt.project.ProvaConceito_BackEnd.repositories.UserRepository;

import java.util.List;

@Service
public class UserService {

    @Autowired(required = false)
    private UserRepository userRepository;

    public void save(String nome, int idade, String morada) {
        userRepository.save(new User(nome, idade, morada));
    }

    public List<User> findAll() {
        return userRepository.findAll();
    }

    public long count() {
        return userRepository.count();
    }

    public User findById(Integer id) {
        return userRepository.findById(id).orElse(null);
    }

    public void delete(Integer id) {
        userRepository.deleteById(id);
    }

}

用户(Pojo)

package pt.project.ProvaConceito_BackEnd.pojos;

import lombok.Getter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "Users")
@Getter
public class User {

    @Id
    private Integer id;
    private String nome;
    private int idade;
    private String morada;

    public User(String nome, int idade, String morada) {
        this.nome = nome;
        this.idade = idade;
        this.morada = morada;
    }
}

用户存储库

package pt.project.ProvaConceito_BackEnd.repositories;

import org.springframework.data.mongodb.repository.MongoRepository;
import pt.project.ProvaConceito_BackEnd.pojos.User;

public interface UserRepository extends MongoRepository<User, Integer> {
}

我在这里做错了什么?我认为问题出在 mongoDBService ... 在这一行中:

UserService userService = new UserService();

因为我认为它没有被注入,但我不知道如何解决......

编辑 1
我在里面有我的主要课程pt.project.ProvaConceito_BackEnd

ProvaConceitoBackEndApplication

package pt.project.ProvaConceito_BackEnd;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ProvaConceitoBackEndApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProvaConceitoBackEndApplication.class, args);
    }

}

标签: javaspring-bootapinullpointerexception

解决方案


我会按照其他贡献者的建议从您的 mongoDBService 中删除“new”关键字并使用 @Repository 注释。

仅当它依赖的所有组件也都自动装配时,自动装配才有效。因此,在您的情况下,因为 mongoDBService 对 UserService 使用 new ,所以它希望存储库也使用“new”。您应该改为在所有级别自动装配,并从 UserService 的自动装配中删除 required=false。

存储库需要 @Repository 注释,否则当 Spring 对其组件进行扫描时,如果没有它,存储库将不会被拾取。@Repository @RestController 等都只是 @Component 的原型,具有不同程度的附加功能


推荐阅读