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

Java中MongoDB无法正确映射POJO问题求助

解决MongoDB POJO映射为空对象的问题

问题分析

从输出结果可见,Document能正常读取数据,但Audience对象仅通过无参构造生成空值,核心原因在于:

  • 私有字段缺少Setter方法,Mongo POJO Codec无法完成字段赋值
  • 存在POJO类未被Codec明确注册的潜在问题

解决步骤

1. 为POJO类添加Setter方法

你的Audience类仅使用@Getter,Mongo的POJO Codec需要通过Setter方法为私有字段赋值,添加@Setter注解即可:

import lombok.*;
import org.bson.codecs.pojo.annotations.BsonProperty;
import org.bson.types.ObjectId;

@AllArgsConstructor
@NoArgsConstructor
@ToString
@Builder
@Getter
@Setter // 新增Setter注解
public class Audience {
    @BsonProperty(value = "id")
    private ObjectId id;
    @BsonProperty(value = "aud_business")
    private double business;
    @BsonProperty(value = "media_info")
    private String mediaInfo;
    @BsonProperty(value = "aud_type")
    private String type;
    @BsonProperty(value = "places_amount")
    private int places;
    // 可选:若需映射数据库中的_id字段,添加以下字段
    @BsonProperty(value = "_id")
    private ObjectId objectId;
}

2. 显式注册POJO类到CodecRegistry

尽管配置了automatic(true),显式注册目标类能确保Codec精准识别映射关系,修改Codec配置:

CodecRegistry pojoCodecRegistry = fromProviders(PojoCodecProvider.builder()
        .automatic(true)
        .register(Audience.class) // 显式注册Audience类
        .build());

3. 验证字段映射一致性

确认@BsonProperty的value与数据库字段完全匹配:

  • aud_business ↔ business
  • media_info ↔ mediaInfo
  • aud_type ↔ type
  • places_amount ↔ places
  • id ↔ id(数据库中该字段与_id为两个独立字段)

4. 检查依赖版本兼容性

确保MongoDB Java驱动版本(建议4.0+)与Lombok版本兼容,避免因版本差异导致反射赋值失败。

验证修改

重新运行测试代码,Audience对象即可正确映射数据库中的数据。

内容的提问来源于stack exchange,提问作者Beliy.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:20:14