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
相关产品推荐
相关产品推荐

