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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:06:02