不使用Spring Boot仅用纯Java能否用MongoRepository?附NPE问题求助
不用Spring Boot,纯Java实现MongoDB CRUD并使用MongoRepository的方案及空指针问题解决
一、能否不依赖Spring Boot使用MongoRepository?
可以,但MongoRepository属于Spring Data MongoDB组件,并非MongoDB原生API,因此需要手动配置Spring Data核心上下文,而非依赖Spring Boot的自动配置。你只需引入Spring Data MongoDB的基础依赖,手动初始化相关组件即可。
二、空指针异常的原因及解决
你的空指针异常根源是employeeRepository未被实例化(值为null),直接调用其方法必然触发NPE。Spring Boot会自动为Repository接口生成代理对象,但纯Java环境下需要手动创建这个代理实例。
具体解决步骤:
- 引入必要依赖(以Maven为例)
<dependencies> <!-- Spring Data MongoDB核心依赖 --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>3.4.6</version> <!-- 选择与MongoDB驱动兼容的版本 --> </dependency> <!-- Spring上下文核心依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.24</version> </dependency> <!-- MongoDB同步驱动 --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>4.6.1</version> </dependency> </dependencies>
- 手动配置MongoDB上下文
创建配置类,初始化MongoClient、MongoTemplate,并通过MongoRepositoryFactory生成Repository代理:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory; import org.springframework.data.mongodb.repository.support.MongoRepositoryFactory; import com.mongodb.client.MongoClients; @Configuration public class MongoConfig { @Bean public MongoTemplate mongoTemplate() { // 连接MongoDB并指定数据库 return new MongoTemplate(new SimpleMongoClientDatabaseFactory(MongoClients.create("mongodb://localhost:27017"), "testdb")); } @Bean public EmployeeRepository employeeRepository(MongoTemplate mongoTemplate) { // 为Repository接口生成代理实例 MongoRepositoryFactory factory = new MongoRepositoryFactory(mongoTemplate); return factory.getRepository(EmployeeRepository.class); } }
- 修改主类代码,从Spring上下文获取Repository实例
不再直接使用未初始化的静态Repository,而是通过Spring上下文获取可用实例:
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.Optional; public class ConnectToMongoDB { public static void main(String[] args) { // 加载Spring配置上下文 try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MongoConfig.class)) { EmployeeRepository employeeRepository = context.getBean(EmployeeRepository.class); // 调用查询方法 boolean userExists = findByUserId("1234567", employeeRepository); System.out.println("用户是否存在:" + userExists); } } public static boolean findByUserId(String userId, EmployeeRepository employeeRepository) { Optional<Employee> employee = Optional.ofNullable(employeeRepository.findByUserId(userId)); return employee.isPresent(); } }
- 确保Employee实体类配置正确
实体类需标注@Document指定集合名,主键字段标注@Id:
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Document(collection = "employee") public class Employee { @Id private String id; private String userId; private String location; // 构造方法、getter、setter方法 }
三、验证CRUD功能
完成上述配置后,你即可正常使用EmployeeRepository的自定义查询方法,以及MongoRepository提供的默认CRUD方法(如save()、deleteById()等)。
内容的提问来源于stack exchange,提问作者Joona Ritva
相关产品推荐
相关产品推荐

