Swagger:Java LocalDateTime转Joda LocalDateTime后请求返回400如何解决
问题根因
将项目全局时间类型替换为Joda LocalDateTime后返回400,核心原因是Jackson默认未适配Joda时间类型的序列化/反序列化规则,且Swagger未配置Joda时间类型的字段映射,导致传入的ISO格式时间字符串无法正确转换为Joda LocalDateTime对象,触发参数校验失败。
解决方案
按以下步骤配置即可解决:
第一步:引入Joda时间对应的Jackson序列化支持模块
若为Maven项目,在pom.xml中添加依赖:<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-joda</artifactId> <version>匹配你项目的Jackson版本</version> </dependency>Spring Boot项目可直接引入对应starter:
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> </dependency>第二步:配置Jackson全局适配Joda时间规则
在application.yml/application.properties中添加配置:spring: jackson: joda-date-time-format: "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" time-zone: UTC serialization: write-dates-as-timestamps: false也可通过Jackson配置类硬编码配置:
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JodaModule()); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")); mapper.setTimeZone(TimeZone.getTimeZone("UTC")); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); return mapper; } }第三步:配置Swagger类型映射
调整Swagger(Springfox)的Docket配置,将Joda LocalDateTime直接映射为字符串类型,确保Swagger生成的请求示例和参数类型匹配:@Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .directModelSubstitute(org.joda.time.LocalDateTime.class, String.class) // 其余原有配置保持不变 .select() .apis(RequestHandlerSelectors.basePackage("你的项目接口包路径")) .paths(PathSelectors.any()) .build(); }可选:单独字段配置
若不需要全局配置,可直接在对应实体类的时间字段上加注解指定格式:@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC") private LocalDateTime dateOfService;
完成以上配置后重启项目,原有格式的Swagger请求即可正常解析。
内容的提问来源于stack exchange,提问作者mattsmith5
相关产品推荐
相关产品推荐

