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↔businessmedia_info↔mediaInfoaud_type↔typeplaces_amount↔placesid↔id(数据库中该字段与_id为两个独立字段)
4. 检查依赖版本兼容性
确保MongoDB Java驱动版本(建议4.0+)与Lombok版本兼容,避免因版本差异导致反射赋值失败。
验证修改
重新运行测试代码,Audience对象即可正确映射数据库中的数据。
内容的提问来源于stack exchange,提问作者Beliy.
相关产品推荐
相关产品推荐

