如何将解析后的JSON对象存入MongoDB?Java场景报错解决
你遇到的Can't find a codec for class com.kdmforce.test.models.News错误,本质是MongoDB原生Java驱动不知道如何将你的自定义News实体类转换成它能识别的BSON格式。直接把实体类传给insertOne或者手动封装成Document都无法解决这个问题,推荐用Spring Data MongoDB来简化实体与MongoDB的交互,它会自动处理对象到BSON的映射。
步骤1:添加Spring Data MongoDB依赖
如果是Spring Boot项目,直接在pom.xml(Maven)中添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
非Spring Boot项目则添加spring-data-mongodb核心依赖。
步骤2:修改实体类,添加MongoDB映射注解
给News类加上MongoDB的映射注解,指定集合名和主键:
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import java.util.List; @Document(collection = "newsCollection") // 指定要存入的MongoDB集合名 public class News { @Id // 标记主键,MongoDB会自动生成ObjectId类型的主键值 private String id; private int totalResults; private List<Article> articles; // 生成所有字段的getter和setter方法 }
Article类无需额外注解,Spring Data会自动处理嵌套对象的映射。
步骤3:创建MongoRepository接口
Spring Data MongoDB提供了MongoRepository接口,封装了常用的CRUD操作,不需要手动写BSON语句:
import org.springframework.data.mongodb.repository.MongoRepository; public interface NewsRepository extends MongoRepository<News, String> { // 继承后自动拥有save、findAll、findById等方法,无需自定义 }
步骤4:修改解析服务,注入Repository并保存数据
在你的ParseService中注入NewsRepository,解析完成后直接调用save方法即可完成插入:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.stream.Collectors; @Service public class ParseService { private final RestTemplate restTemplate; private final NewsRepository newsRepository; // 推荐使用构造注入(Spring 4.3+支持自动注入,可省略@Autowired) public ParseService(RestTemplate restTemplate, NewsRepository newsRepository) { this.restTemplate = restTemplate; this.newsRepository = newsRepository; } public News parseAndSaveFive() { final int COUNTER = 5; News news = restTemplate.getForObject( "https://newsapi.org/v2/top-headlines?sources=bbc-news&apiKey=19acc3a371d145ecb37a093f9985ea21", News.class ); news.setArticles(news.getArticles().stream().limit(COUNTER).collect(Collectors.toList())); news.setTotalResults(COUNTER); // 直接保存到MongoDB,返回保存后的对象(包含自动生成的id) return newsRepository.save(news); } }
步骤5:配置MongoDB连接
如果是Spring Boot项目,只需在application.properties中配置连接信息:
spring.data.mongodb.uri=mongodb://localhost:27017/test
这样Spring会自动帮你创建MongoClient、MongoTemplate等核心对象,无需手动编写连接代码。
替代方案:使用MongoTemplate
如果不想用Repository,也可以直接注入MongoTemplate来操作:
// 在ParseService中注入MongoTemplate private final MongoTemplate mongoTemplate; // 保存时调用 mongoTemplate.save(news);
为什么之前的方法失败?
你之前手动创建MongoClient并使用Document封装的方式,MongoDB原生驱动无法识别自定义的News类结构,而Spring Data MongoDB通过MappingMongoConverter组件,会自动将实体类的字段映射为BSON文档的键值对,包括嵌套的Article列表也能正确处理。
内容的提问来源于stack exchange,提问作者Real gamb

