Spring Boot MongoDB中DTO日期转字符串失效,求修复方案
修复DTO日期格式化失效问题
你的问题根源有两个:
- 你用的是DTO接口而非实体类,Jackson在处理接口(比如Spring Data Projections场景)时,对方法上的注解支持有限,默认序列化逻辑可能不会读取接口方法上的格式配置。
- 当前代码里的
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:保留接口,自定义序列化/反序列化器
如果因为业务限制必须用接口,需要自定义带格式的序列化器,替换默认的组件:
- 先写自定义序列化/反序列化器:
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")); } }
- 在接口方法上替换注解:
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
相关产品推荐
相关产品推荐

