【问题标题】:@DateTimeFormat Not working with class member in Spring boot@DateTimeFormat 在 Spring Boot 中不能与类成员一起使用
【发布时间】:2021-08-04 20:09:34
【问题描述】:

我的 pojo 类如下所示

公共类员工{

private int empId;
    
    @NotEmpty
    private String empName;

    
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    private Date empDoj;

    public int getEmpId() {
        return empId;
    }

    public void setEmpId(int empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public Date getEmpDoj() {
        return empDoj;
    }

    public void setEmpDoj(Date empDoj) {
        this.empDoj = empDoj;
    }

我正在接受控制器中的请求,如下所示

@RequestMapping(value = "/employee",method = RequestMethod.POST)
    public Employee employee(@RequestBody @Valid Employee employee
            ) { 
        return employee ;
    }

当我从邮递员发送以下 JSON 请求时,它给了我一个错误

{
         "empName":"Anubhav",
         "empDoj":"10/10/2019"
      }

JSON 解析错误:无法从字符串“10/10/2019”反序列化 java.util.Date 类型的值:不是有效的表示(错误:无法解析日期值 '10/10/2019':无法解析日期“10/10/2019”:不兼容任何标准格式(“yyyy-MM-dd'T'HH:mm:ss.SSSX”、“yyyy-MM-dd'T'HH:mm:ss. SSS", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"));嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“10/10/2019”反序列化类型为 java.util.Date 的值:不是有效的表示(错误:无法解析日期值 '10/10/ 2019':无法解析日期“10/10/2019”:不兼容任何标准格式(“yyyy-MM-dd'T'HH:mm:ss.SSSX”、“yyyy-MM-dd'T'HH :mm:ss.SSS", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd")) 在 [来源:(PushbackInputStream); l

当我对方法处理程序做同样的事情时

@RequestMapping(value = "/dateformat",method = RequestMethod.POST)
    public Date dateex(@DateTimeFormat(pattern = "dd-MM-yyyy") @RequestParam(value = "date")Date date) {        

}

它工作正常。将给定模式中指定的字符串转换为 Date 对象,那么为什么不使用 Java 类成员。在文档中还说它可以用于方法参数或格式化为给定日期类型字段的字段

【问题讨论】:

  • 这能回答你的问题吗? Date format Mapping to JSON Jackson
  • @DwB 你能评论我在原始问题中所做的编辑吗?
  • DateTimeFormat 是 Spring Boot 注解,JsonFormat 是 Jackson 注解。看来 Spring Boot 没有在方法参数类的“内部”搜索 dateTimeFormat 注释,它只将其应用于方法参数。

标签: json spring-boot date validation


【解决方案1】:

由于您发送的是 JSON,您需要将 @JsonFormat(pattern="dd/MM/yyyy") 注释添加到 empDoj。如果您所有的日期都是这种格式,您可以在 application.properties 文件中设置 spring.jackson.date-format=dd/MM/yyyy。

【讨论】:

  • 李 非常感谢您的回答。那些它正在工作,但为什么我们需要使用@JSONFormat。根据文档,它是一个通用注释,用于配置如何序列化属性值的详细信息。这里涉及的属性主要是与日期相关的序列化。在这种特殊情况下,我只希望我的 JSON 字符串值采用模式格式并将其转换为给定的 Date 对象。为什么这里需要 JsonFormat?
  • 由于 Jackson 正在序列化/反序列化您的 JSON,您需要使用 Jackson 注释。如果 Spring 正在序列化/反序列化请求正文,则 DateTimeFormat 将起作用。 DateTimeFormat 也适用于请求参数,因为 Spring 序列化/反序列化这些。
【解决方案2】:

关于我投票结束的一些细节。

您正在尝试使用 SpringBoot 参数注释来指定 JSON 格式。 我相信你需要使用JsonFormat注解 (如对this question 的buræquete 回答中所述)

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 2016-12-27
    • 1970-01-01
    • 2016-09-15
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    相关资源
    最近更新 更多