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

OpenAPI Java Generator序列化LocalDate为数组而非日期格式问题求助

解决方案

方案一:全局配置Jackson日期序列化规则(无需修改生成代码)

在Spring项目中创建Jackson配置类,统一指定Java 8日期类型的序列化格式,覆盖默认的数组/时间戳行为:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Configuration
public class RestTemplateDateConfig {

    // 匹配OpenAPI date格式的日期模板
    private static final String DATE_PATTERN = "yyyy-MM-dd";
    // 匹配OpenAPI date-time格式的日期时间模板(符合ISO-8601)
    private static final String DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";

    @Bean
    public MappingJackson2HttpMessageConverter jacksonMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = converter.getObjectMapper();

        JavaTimeModule timeModule = new JavaTimeModule();
        // 为LocalDate注册指定格式的序列化器
        timeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_PATTERN)));
        // 为LocalDateTime注册指定格式的序列化器
        timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)));

        objectMapper.registerModule(timeModule);
        // 关闭默认的日期转时间戳行为
        objectMapper.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        converter.setObjectMapper(objectMapper);
        return converter;
    }

    // 如果是自定义RestTemplate,需手动注入配置好的MessageConverter
    @Bean
    public RestTemplate restTemplate(MappingJackson2HttpMessageConverter jacksonMessageConverter) {
        RestTemplate restTemplate = new RestTemplate();
        // 移除默认的Jackson转换器,替换为自定义配置的版本
        restTemplate.getMessageConverters().removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
        restTemplate.getMessageConverters().add(jacksonMessageConverter);
        return restTemplate;
    }
}

配置完成后,所有通过RestTemplate发送的请求中,LocalDate会序列化为"2023-01-01"格式,LocalDateTime会序列化为符合ISO-8601的标准格式。

方案二:调整OpenAPI生成器配置,自动生成序列化注解

如果允许重新生成客户端代码,可以修改openapi-generator-maven-plugin的配置,让生成的代码自动带上@JsonFormat注解,无需手动修改:

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>6.3.0</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputSpec>${project.basedir}/src/main/resources/your-openapi-spec.yaml</inputSpec>
                <generatorName>java</generatorName>
                <library>resttemplate</library>
                <dateLibrary>java8</dateLibrary>
                <configOptions>
                    <!-- 启用Jackson注解支持 -->
                    <jackson>true</jackson>
                    <!-- 指定date类型的格式化模板 -->
                    <dateFormat>yyyy-MM-dd</dateFormat>
                    <!-- 指定date-time类型的格式化模板 -->
                    <dateTimeFormat>yyyy-MM-dd'T'HH:mm:ss.SSSXXX</dateTimeFormat>
                </configOptions>
            </configuration>
        </execution>
    </executions>
</plugin>

重新生成代码后,targetDate字段会自动添加注解:

@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate targetDate;

date-time类型的字段也会带上对应格式的@JsonFormat注解,序列化时自动遵循OpenAPI规范。

内容的提问来源于stack exchange,提问作者peer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:35:03