You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将解析后的JSON对象存入MongoDB?Java场景报错解决

解决MongoDB插入自定义实体类的Codec错误问题

你遇到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:24:50