MongoTemplate聚合结果无法正确映射到Java对象问题求解
解决方案
方案1:聚合查询时新增字段别名映射(无需改POJO、无需改全局配置,最快捷)
在你的聚合逻辑中新增一个project步骤,把Mongo中大写开头的字段直接映射为POJO对应的小写开头字段名:
ProjectionOperation project = Aggregation.project() .and("CardBranding").as("cardBranding"); // 把这个project加到你的agg聚合管道的最末尾即可 Aggregation agg = Aggregation.newAggregation( // 你原来的聚合步骤... project );
执行聚合后字段会直接匹配POJO的cardBranding属性,不需要修改其他配置。
方案2:POJO字段添加@Field注解指定映射字段名(稳定性最高)
Spring Data MongoDB默认使用自身的映射规则,不会读取Jackson的@JsonProperty注解,你可以在POJO字段上加@org.springframework.data.mongodb.core.mapping.Field注解指定实际存储的字段名:
@JsonProperty("CardBranding") @NotNull @Field("CardBranding") // 新增这一行,明确指定映射Mongo中的CardBranding字段 private String cardBranding;
如果你是用jsonSchema2pojo批量生成POJO,可以配置生成规则自动插入该注解:在jsonschema2pojo的配置文件中开启customAnnotator,自定义注解生成逻辑为每个字段加对应@Field注解即可,不需要手动改每个生成的POJO。
方案3:全局配置Mongo映射识别Jackson注解(一劳永逸)
如果你希望所有POJO的@JsonProperty注解都能被Mongo映射识别,可以自定义MappingMongoConverter配置,让Mongo的映射逻辑兼容Jackson注解:
@Configuration public class MongoConfig extends AbstractMongoClientConfiguration { // 省略其他Mongo配置 @Bean @Override public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory databaseFactory, MongoCustomConversions customConversions, MongoMappingContext mappingContext) { MappingMongoConverter converter = super.mappingMongoConverter(databaseFactory, customConversions, mappingContext); // 配置字段命名策略,优先读取@JsonProperty注解的值作为映射字段名 converter.setFieldNamingStrategy(field -> { JsonProperty jsonProperty = field.getField().getAnnotation(JsonProperty.class); if (jsonProperty != null && StringUtils.hasText(jsonProperty.value())) { return jsonProperty.value(); } // 没有JsonProperty注解的字段走默认命名策略 return field.getName(); }); return converter; } }
配置完成后你原来的POJO不需要做任何修改,@JsonProperty的值会直接作为Mongo字段映射的依据。
方案4:自定义大小写不敏感的全局映射策略
如果你需要完全忽略字段名大小写做映射,可以修改上述自定义FieldNamingStrategy的逻辑,对Mongo返回的字段和Java字段做大小写不敏感匹配即可,该方案容易出现同名字段冲突,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者Fernando
相关产品推荐
相关产品推荐

