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

Spring Boot MongoDB中DTO日期转字符串失效,求修复方案

修复DTO日期格式化失效问题

你的问题根源有两个:

  1. 你用的是DTO接口而非实体类,Jackson在处理接口(比如Spring Data Projections场景)时,对方法上的注解支持有限,默认序列化逻辑可能不会读取接口方法上的格式配置。
  2. 当前代码里的LocalDateTimeSerializer/LocalDateTimeDeserializer是Jackson默认的JSR310组件,默认用ISO格式序列化;另外@DateTimeFormat是Spring MVC用于请求参数绑定的注解,和Jackson的JSON序列化无关,所以完全起不到作用。

可行修复方案

方案1:改用类DTO(最可靠)

Jackson对类的注解支持更完善,把接口改成实体类,直接在字段或getter上使用@JsonFormat即可:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonFormat;

import java.time.LocalDateTime;

@JsonInclude(value = Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class TransactionDTO {

    private String id;
    private Long ticketOrderId;
    private Long userId;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    private LocalDateTime createdDate;

    // Getters & Setters
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public Long getTicketOrderId() { return ticketOrderId; }
    public void setTicketOrderId(Long ticketOrderId) { this.ticketOrderId = ticketOrderId; }
    public Long getUserId() { return userId; }
    public void setUserId(Long userId) { this.userId = userId; }
    public LocalDateTime getCreatedDate() { return createdDate; }
    public void setCreatedDate(LocalDateTime createdDate) { this.createdDate = createdDate; }
}

方案2:保留接口,自定义序列化/反序列化器

如果因为业务限制必须用接口,需要自定义带格式的序列化器,替换默认的组件:

  1. 先写自定义序列化/反序列化器:
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import java.time.format.DateTimeFormatter;

public class CustomLocalDateTimeSerializer extends LocalDateTimeSerializer {
    public CustomLocalDateTimeSerializer() {
        super(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
    }
}

public class CustomLocalDateTimeDeserializer extends LocalDateTimeDeserializer {
    public CustomLocalDateTimeDeserializer() {
        super(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
    }
}
  1. 在接口方法上替换注解:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.annotation.JsonFormat;

import java.time.LocalDateTime;

@JsonInclude(value = Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public interface TransactionDTO {

    String getId();
    Long getTicketOrderId();
    Long getUserId();
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    @JsonSerialize(using = CustomLocalDateTimeSerializer.class)
    @JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
    LocalDateTime getCreatedDate();
}

额外检查

确保你的项目已经引入Jackson的JSR310模块依赖(Maven示例):

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:56:00