You need to enable JavaScript to run this app. 如何将MongoDB中Date类型数据查询后映射为POJO的String类型字段
优惠活动
大模型
产品
解决方案
定价
更多

如何将MongoDB中Date类型数据查询后映射为POJO的String类型字段

解决方案

以下是三种可直接落地的实现方式,你可以根据自己的项目场景选择:


方案1:用序列化注解控制返回格式(最推荐,改动最小)

这种方式不需要修改Mongo映射逻辑,只需要给POJO的字段加序列化注解即可:

  1. POJO的addedDate保留Date类型,保证Mongo查询映射正常
  2. 引入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:

  1. 编写读取转换器:
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);
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 00:15:02