Spring Boot连接MongoDB调用Repo时出现NPE问题求助
Spring Boot MongoDB 连接后调用仓库出现 NullPointerException 问题
我创建了一个Spring Boot应用,在application.properties中配置了MongoDB连接:
spring.data.mongodb.uri=mongodb://localhost:27017/product-service
同时已通过MongoDB Compass使用该URI成功添加连接,且确认创建了名为product-service的数据库,MongoDB服务也正常运行,但调用数据仓库获取数据时抛出NullPointerException(NPE)。启用MongoDB日志后未发现相关请求日志。
错误日志
java.lang.NullPointerException: null
at com.emanuel.productservice.controller.ProductController.getAllProducts(ProductController.java:29) ~[main/:na]
相关代码
控制器代码
@RestController @RequestMapping("api/product") @RequiredArgsConstructor public class ProductController { private ProductService productService; @GetMapping @ResponseStatus(HttpStatus.OK) public List<ProductResponse> getAllProducts(){ return productService.getAllProducts(); } }
服务代码
@Service @RequiredArgsConstructor @Slf4j public class ProductService { private final ProductRepo productRepo; public List<ProductResponse> getAllProducts() { List<Product> products = productRepo.findAll(); // 此处出现NPE return products.stream().map(this::mapToProductResponse).collect(Collectors.toList()); } }
仓库代码
public interface ProductRepo extends MongoRepository<Product, String> { }
使用版本与依赖
- MongoDB Community Server 6.0.4
- Spring Boot 2.7.8
- Gradle依赖:
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
问题原因与解决方法
核心问题
控制器中的productService未被正确注入。你使用了@RequiredArgsConstructor注解,但productService字段没有添加final修饰符,导致Lombok无法生成对应的构造函数完成依赖注入,最终productService为null,调用其方法时抛出NPE。
修复步骤
修改ProductController代码,给productService添加final修饰符:
@RestController @RequestMapping("api/product") @RequiredArgsConstructor public class ProductController { private final ProductService productService; // 添加final修饰符 @GetMapping @ResponseStatus(HttpStatus.OK) public List<ProductResponse> getAllProducts(){ return productService.getAllProducts(); } }
额外验证点
- 确认
Product实体类已添加@Document注解,指定对应集合(如@Document(collection = "products")),否则Spring Data MongoDB无法映射到正确的集合。 - 检查项目组件扫描范围,确保
ProductController、ProductService、ProductRepo所在包被Spring Boot扫描到(默认扫描启动类所在包及其子包)。
内容的提问来源于stack exchange,提问作者noob234
相关产品推荐
相关产品推荐

