如何通过Spring配置让Jackson输出数据库原生Timestamp格式?
解决Spring中java.sql.Timestamp JSON序列化格式问题
其实Spring并没有提供直接的配置属性让你直接输出数据库原生的Timestamp格式,但有几个实用的方案可以解决这个问题:
方案一:自定义Jackson序列化规则
Spring MVC默认使用Jackson来处理JSON序列化,我们可以通过自定义java.sql.Timestamp的序列化器来指定输出格式:
- 首先创建一个自定义的序列化类:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.sql.Timestamp; import java.text.SimpleDateFormat; public class CustomTimestampSerializer extends JsonSerializer<Timestamp> { private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); @Override public void serialize(Timestamp timestamp, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { if (timestamp != null) { jsonGenerator.writeString(DATE_FORMAT.format(timestamp)); } } }
- 然后把这个序列化器注册到Jackson的
ObjectMapper中。如果是Spring Boot项目,可以通过配置类来实现:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.sql.Timestamp; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(Timestamp.class, new CustomTimestampSerializer()); objectMapper.registerModule(module); return objectMapper; } }
这样所有java.sql.Timestamp类型的字段都会被序列化成你想要的yyyy-MM-dd HH:mm:ss.S格式,和数据库原生输出一致。
方案二:在SQL查询中直接格式化
如果你不想修改Java代码,也可以在SQL查询的时候直接将Timestamp字段格式化为字符串。比如MySQL可以用DATE_FORMAT函数:
SELECT DATE_FORMAT(your_timestamp_column, '%Y-%m-%d %H:%i:%s.%f') AS formatted_time FROM your_table;
Oracle可以用TO_CHAR函数:
SELECT TO_CHAR(your_timestamp_column, 'YYYY-MM-DD HH24:MI:SS.FF') AS formatted_time FROM your_table;
这种方式直接从数据库返回格式化后的字符串,Java层不需要额外处理,但缺点是格式逻辑耦合在SQL中,如果多个查询都需要这个格式,会有重复代码。
补充说明
Spring默认的Timestamp序列化格式是ISO-8601带时区的格式(比如2018-04-26T07:52:02.000+0000),这是Jackson的默认行为,所以没有现成的配置属性可以直接切换到数据库原生格式,需要通过上面的方式自定义处理。
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

