安定.528 2025-01-06 14:42 采纳率: 92.9%
浏览 111

前端传来格式化年月日,后端Date类型无法正常接收

前端传来格式化年月日,后端Date类型无法正常接收
这是我的实体类

@TableField(value = "effective_start_date")
    @ApiModelProperty(value="生效期开始时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date effectiveStartDate;

 
    @TableField(value = "effective_end_date")
    @ApiModelProperty(value="生效期结束时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date effectiveEndDate;

前端传过来的是这样的:

{
    "effectiveStartDate": "2025-01-06",
    "effectiveEndDate": "2025-01-18",
    "unitPrice": 123,
    "notes": "123"
}

这是我的报错信息:

Cannot deserialize value of type java.util.Date from String "2025-01-06": not a valid representation (error: Failed to parse Date value '2025-01-06': Unparseable date: "2025-01-06") 

为什么会这样?
只用注解的方式,不要用什么全局配置文件,也不要单独写个什么handler 反序列化的 只用注解! 为什么我的注解不生效?

  • 写回答

2条回答 默认 最新

  • GISer Liu 2025-01-06 20:07
    关注

    该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:

    问题分析

    根据用户提供的信息,前端传递的日期格式为 yyyy-MM-dd,而后端在接收时使用了 Date 类型,并且使用了 @DateTimeFormat@JsonFormat 注解来指定日期格式。然而,后端在反序列化时仍然报错,提示无法将字符串 "2025-01-06" 解析为 Date 类型。

    问题定位

    1. 注解使用问题

      • @DateTimeFormat 是 Spring 框架提供的注解,主要用于处理表单提交时的日期格式化,通常用于 @RequestParam@ModelAttribute 等场景。
      • @JsonFormat 是 Jackson 库提供的注解,用于指定 JSON 序列化和反序列化时的日期格式。
    2. 反序列化问题

      • 报错信息表明,Jackson 在反序列化时无法将字符串 "2025-01-06" 转换为 Date 类型。这可能是因为 Jackson 默认的日期格式与前端传递的格式不匹配。

    解决方案

    为了确保 Jackson 能够正确解析前端传递的日期字符串,我们需要确保 @JsonFormat 注解的格式与前端传递的格式一致。此外,@DateTimeFormat 在这种情况下可能不会生效,因为它主要用于 Spring MVC 的表单处理,而不是 JSON 反序列化。

    1. 确保 @JsonFormat 注解正确使用

    确保 @JsonFormat 注解的 pattern 属性与前端传递的日期格式一致。用户已经正确使用了 @JsonFormat 注解,格式为 yyyy-MM-dd,这与前端传递的格式一致。

    2. 检查 Jackson 配置

    虽然用户要求不使用全局配置文件,但我们可以通过注解来确保 Jackson 能够正确解析日期格式。确保 @JsonFormat 注解的 timezone 属性与前端传递的时区一致。

    3. 确保 Jackson 依赖正确引入

    确保项目中正确引入了 Jackson 依赖,并且版本兼容。如果使用的是 Spring Boot,Jackson 通常会自动引入。

    代码示例

    以下是用户提供的实体类代码,已经正确使用了 @JsonFormat 注解:

    import com.fasterxml.jackson.annotation.JsonFormat;
    import org.springframework.format.annotation.DateTimeFormat;
    import io.swagger.annotations.ApiModelProperty;
    import java.util.Date;
    
    public class MyEntity {
    
        @TableField(value = "effective_start_date")
        @ApiModelProperty(value="生效期开始时间")
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
        private Date effectiveStartDate;
    
        @TableField(value = "effective_end_date")
        @ApiModelProperty(value="生效期结束时间")
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
        private Date effectiveEndDate;
    
        // 其他字段和getter/setter方法
    }
    

    验证步骤

    1. 前端传递的 JSON

      {
          "effectiveStartDate": "2025-01-06",
          "effectiveEndDate": "2025-01-18",
          "unitPrice": 123,
          "notes": "123"
      }
      
    2. 后端接收

      • 确保 @JsonFormat 注解的 patterntimezone 与前端传递的格式一致。
      • 确保 Jackson 能够正确解析日期字符串。

    总结

    通过正确使用 @JsonFormat 注解,并确保其格式与前端传递的日期格式一致,可以解决后端无法正确接收前端传递的日期字符串的问题。如果问题仍然存在,建议检查 Jackson 的依赖版本和配置,确保没有其他配置干扰了日期的反序列化。

    希望这个解决方案能够帮助您解决问题!如果有其他疑问,欢迎继续提问。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    评论

报告相同问题?

问题事件

  • 创建了问题 1月6日