首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring Boot 日期類型 JSON 序列化配置與 JUnit 測試指南

     編輯:程式設計綜合問答

代碼背景

項目中使用 Jackson2ObjectMapperBuilder 配置了 LocalDate、LocalDateTime、ZonedDateTime 的 JSON 序列化/反序列化,需編寫 JUnit 測試驗證功能。

原始配置代碼分析

@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.indentOutput(true)
        .serializerByType(LocalDate.class, new JsonSerializer<LocalDate>() {
            @Override
            public void serialize(LocalDate value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
                jgen.writeString(value.toString());
            }
        })
        .deserializerByType(LocalDate.class, new JsonDeserializer<LocalDate>() {
            @Override
            public LocalDate deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
                return LocalDate.parse(jp.getValueAsString());
            }
        })
        // LocalDateTime、ZonedDateTime 同理...
        ;
    return builder;
}

核心功能點

  1. LocalDate:序列化為 "yyyy-MM-dd",反序列化解析 ISO 格式
  2. LocalDateTime:序列化為 "yyyy-MM-ddTHH:mm:ss",反序列化同理
  3. ZonedDateTime:序列化為帶時區偏移的字符串
  4. 全局開啟 indentOutput(true) 美化輸出

JUnit 測試完整示例

@SpringBootTest
@AutoConfigureMockMvc
class DateSerializationTest {

    @Autowired
    private ObjectMapper objectMapper;

    @Test
    void testLocalDateSerialization() throws Exception {
        LocalDate date = LocalDate.of(2023, 10, 15);
        String json = objectMapper.writeValueAsString(date);
        assertEquals("\"2023-10-15\"", json);
        
        LocalDate parsed = objectMapper.readValue(json, LocalDate.class);
        assertEquals(date, parsed);
    }

    @Test
    void testLocalDateTimeSerialization() throws Exception {
        LocalDateTime dt = LocalDateTime.of(2023, 10, 15, 14, 30, 45);
        String json = objectMapper.writeValueAsString(dt);
        assertEquals("\"2023-10-15T14:30:45\"", json);
    }

    @Test
    void testZonedDateTimeSerialization() throws Exception {
        ZonedDateTime zdt = ZonedDateTime.of(2023, 10, 15, 14, 30, 45, 0, ZoneId.of("Asia/Shanghai"));
        String json = objectMapper.writeValueAsString(zdt);
        // 包含時區偏移,如 "2023-10-15T14:30:45+08:00"
        assertTrue(json.contains("+08:00"));
    }

    @Test
    void testDtoWithDates() throws Exception {
        // 測試包含日期字段的 DTO 對象
        EventDto dto = new EventDto("發布會", LocalDate.now(), LocalDateTime.now());
        String json = objectMapper.writeValueAsString(dto);
        System.out.println(json); // 觀察完整結構
        assertNotNull(json);
    }
}

// 測試用 DTO
class EventDto {
    public String name;
    public LocalDate date;
    public LocalDateTime dateTime;
    public EventDto(String name, LocalDate date, LocalDateTime dateTime) {
        this.name = name; this.date = date; this.dateTime = dateTime;
    }
}

測試關鍵點

  • 使用 @Autowired ObjectMapper 獲取 Spring 配置好的實例
  • 分別測試序列化(to JSON)與反序列化(from JSON)
  • 驗證格式符合 ISO-8601 標準
  • 測試實體類(DTO)整體序列化場景

常見坑點提示

  1. 若測試失敗,檢查是否漏掉 @JsonFormat 註解衝突
  2. 時區問題:確保 JVM 時區或配置 jackson.time-zone
  3. Java 8 日期類需依賴 jackson-datatype-jsr310 模塊(Spring Boot 默認已包含)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved