java - 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]
这个项目的结构是:
- 爪哇
MongoDB
- mongoDBService
- 用户服务
波霍斯
- 用户
存储库
- 用户存储库
我将分享我现在拥有的代码:
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);
}
}
解决方案
我会按照其他贡献者的建议从您的 mongoDBService 中删除“new”关键字并使用 @Repository 注释。
仅当它依赖的所有组件也都自动装配时,自动装配才有效。因此,在您的情况下,因为 mongoDBService 对 UserService 使用 new ,所以它希望存储库也使用“new”。您应该改为在所有级别自动装配,并从 UserService 的自动装配中删除 required=false。
存储库需要 @Repository 注释,否则当 Spring 对其组件进行扫描时,如果没有它,存储库将不会被拾取。@Repository @RestController 等都只是 @Component 的原型,具有不同程度的附加功能
推荐阅读
- python - 如何修复熊猫中的“未找到级别”错误?
- c# - Streamwriter set true stil 覆盖 csv 行
- apache - 将 nginx conf 转换为 .htaccess 文件
- laravel - 如何将 gulpfile.js 文件内容迁移到 webpack-mix.js 文件
- c# - 带有 httpResponseMessage 的 WebApi 2 下载文件返回未经授权的 401
- django - 从视图中设置字段表单值
- java - 什么时候在 Java 中使用 ArrayList、LinkedList 和 Stack?
- laravel - 如何使用 CRUDBooster 和 Laravel 制作网站?
- python - 在 Numpy 中比较两个数组
- arduino - 为什么在使用对数时显示 Esp32 “nan”?