NullPointerException: null при попытке выполнить MongoDB FindByID - PullRequest
0 голосов
/ 04 августа 2020

Итак, я пытаюсь подключить 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]

Структура этого проекта:

  • Java
    • MongoDB

      • mongoDBService
      • UserService
    • Pojos

      • Пользователь
    • Репозитории

      • Репозиторий пользователей

Я поделюсь кодом, который у меня есть прямо сейчас:

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);
    }
}

UserService

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);
    }

}

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

Вам необходимо обновить свой репозиторий и User.class, чтобы он имел строковый тип идентификатора вместо Integer. Это необходимо для репозиториев mon go. Может не полностью решить вашу проблему, но будет шагом в правильном направлении

@Repository
public interface UserRepository extends MongoRepository<User, String> {
}
0 голосов
/ 05 августа 2020

Я бы последовал предложениям других участников, чтобы удалить ключевое слово «new» из вашей mongoDBService и использовать аннотацию @Repository.

Автоматическое подключение работает только в том случае, если все компоненты, на которые он опирается, также автоматически подключены. Итак, в вашем случае, поскольку mongoDBService использует new для UserService, он ожидает, что репозиторий также будет использовать «новый». Вместо этого вы должны автоматически подключать на всех уровнях и удалить required = false из автоматического подключения в UserService.

Репозиторий требует аннотации @Repository, иначе, когда Spring сканирует свой компонент, репозиторий не будет поднят без него. @Repository @RestController et c - все это просто стереотипы для @Component с различной степенью дополнительной функциональности

0 голосов
/ 04 августа 2020

Не используйте new для создания объекта таким образом, потому что spring не будет знать об этом объекте и не сможет его внедрить.

Поскольку вы уже аннотировали UserService с помощью @service вы должны использовать аннотацию @Autowired

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 {

    @Autowired
    private UserService userService;

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

Также аннотируйте класс UserRepository с помощью @Repository

package pt.project.ProvaConceito_BackEnd.repositories;

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

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

Удалите required = false из UserService class

Убедитесь, что в пакете pt.project.ProvaConceito_BackEnd есть класс с аннотацией @SpringBootApplication.

...