如何将MongoDB中Date类型数据查询后映射为POJO的String类型字段
解决方案
以下是三种可直接落地的实现方式,你可以根据自己的项目场景选择:
方案1:用序列化注解控制返回格式(最推荐,改动最小)
这种方式不需要修改Mongo映射逻辑,只需要给POJO的字段加序列化注解即可:
- POJO的
addedDate保留Date类型,保证Mongo查询映射正常 - 引入Jackson的
@JsonFormat注解,控制序列化返回给接口时的格式,示例代码:
import com.fasterxml.jackson.annotation.JsonFormat; import java.util.Date; public class Item { // pattern按你需要的返回格式调整,timezone必须配置,避免出现时区差问题 @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date addedDate; private String name; // 原有getter、setter保持不变 }
接口返回时Jackson会自动把Date类型的字段转为指定格式的字符串,不需要额外处理。
方案2:自定义Mongo读取转换器,直接映射为String
如果你希望POJO的addedDate直接用String类型,可以注册Mongo自定义转换器,查询时自动把Mongo中存储的Date类型转为字符串赋值给POJO:
- 编写读取转换器:
import org.bson.types.Date; import org.springframework.core.convert.converter.Converter; import java.time.format.DateTimeFormatter; public class MongoDateToStringConverter implements Converter<Date, String> { private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @Override public String convert(Date source) { return source.toLocalDateTime().toLocalDate().format(DATE_FORMAT); } }
- 在Mongo配置类中注册该转换器:
import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import java.util.ArrayList; import java.util.List; @Configuration public class MongoDbConfig extends AbstractMongoClientConfiguration { @Override protected String getDatabaseName() { return "你的业务数据库名"; } @Override public MongoCustomConversions customConversions() { List<Converter<?, ?>> converterList = new ArrayList<>(); converterList.add(new MongoDateToStringConverter()); return new MongoCustomConversions(converterList); } }
配置完成后,POJO的addedDate可以直接定义为String类型,查询时会自动完成转换。
方案3:新增冗余返回字段
如果不想修改原有映射逻辑,也不想加全局配置,可以在POJO中新增一个瞬态的字符串字段,专门用于接口返回:
import org.springframework.data.mongodb.core.mapping.Transient; import java.util.Date; import java.time.ZoneId; import java.time.format.DateTimeFormatter; public class Item { // 保留Date类型供Mongo映射 private Date addedDate; // 标记为瞬态,Mongo不会处理该字段 @Transient private String addedDateStr; // 重写getter,读取时自动格式化 public String getAddedDateStr() { if (this.addedDate == null) { return null; } return this.addedDate.toInstant() .atZone(ZoneId.of("GMT+8")) .toLocalDate() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); } // 其他getter、setter保持不变 }
接口返回时可以直接返回addedDateStr字段,也可以用@JsonIgnore注解标记原addedDate字段,避免返回Date类型值。
内容的提问来源于stack exchange,提问作者usr_11
相关产品推荐
相关产品推荐

