Spring XML应用中如何用ObjectMapper将LocalDate序列化为指定日期格式
解决Spring XML应用中LocalDate序列化格式问题
问题根源
你使用的SimpleDateFormat仅适配旧的java.util.Date类型,对Java 8引入的LocalDate完全不起作用。Jackson默认会序列化LocalDate的内部结构,导致输出冗余的日期字段详情。
解决方案
1. 引入Jackson Java 8日期模块
首先需要添加专门处理Java 8日期类型的依赖:
- Maven依赖:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>你的Jackson版本号</version> </dependency>
- Gradle依赖:
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:你的Jackson版本号'
2. 配置LocalDate序列化格式
有两种实现方式,可根据场景选择:
方式一:全局配置(Spring XML全局生效)
在Spring XML配置文件中定义ObjectMapper Bean,注册日期模块并指定格式:
<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"> <!-- 注册Java 8日期模块 --> <property name="modules"> <list> <bean class="com.fasterxml.jackson.datatype.jsr310.JavaTimeModule"/> </list> </property> <!-- 为LocalDate指定序列化格式 --> <property name="serializers"> <map> <entry key="java.time.LocalDate"> <bean class="com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer"> <constructor-arg> <bean class="java.time.format.DateTimeFormatter"> <constructor-arg value="yyyy-MMM-dd"/> </bean> </constructor-arg> </bean> </entry> </map> </property> </bean>
后续在需要序列化的组件中注入该objectMapper即可。
方式二:字段注解(局部生效)
如果仅需单个字段自定义格式,直接在Employee类的日期字段上添加注解:
import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDate; @AllArgsConstructor @NoArgsConstructor @Data @Builder class Employee { private String firstName; private String lastName; private Long salary; @JsonFormat(pattern = "yyyy-MMM-dd") private LocalDate joiningDate; }
同时确保ObjectMapper注册了日期模块:
// 修改MainDemo中的初始化代码 ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); String json = mapper.writeValueAsString(employee); System.out.println(json);
3. 最终输出示例
修改完成后,序列化结果会变为:
{"firstName":"John","lastName":"Doe","salary":10000,"joiningDate":"2024-May-28"}
内容的提问来源于stack exchange,提问作者PAA
相关产品推荐
相关产品推荐

