【问题标题】:RestController - Use @DateTimeFormat inside deserialized POJORestController - 在反序列化 POJO 中使用 @DateTimeFormat
【发布时间】:2019-11-08 00:26:07
【问题描述】:

我有需要反序列化的带有日期参数的 JSON 正文

关注Working with Date Parameters in Spring

使用@DateTimeFormat注解对参数进行注解,并提供格式化模式参数:

我们也可以使用自己的转换模式。我们可以在@DateTimeFormat 注解中提供一个模式参数:

@PostMapping("/date")
public void date(@RequestParam("date") 
   @DateTimeFormat(pattern = "dd.MM.yyyy") Date date) {

我创建了一个 POJO

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RequestVO {

    @DateTimeFormat(pattern = "dd.MM.yyyy hh:mm:ss")
    Date startDate;

我的 RestController 端点

@PostMapping(value = "path", consumes = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody String updateDate(RequestVO requestVO) {
        logger.debug("requestVO.getStartDate()=" + requestVO.getStartDate());

我发布数据:

{"startDate":"11.11.2019 11:11:11"}

但我的 startDate 为空

  • 其他参数工作正常(日期除外)

我可以在 Object 中使用@DateTimeFormat 还是必须像示例中那样声明所有参数?

【问题讨论】:

  • 尝试将Date更改为LocalDateTime
  • @MaruthiAdithya 不幸的是与LocalDateTime的结果相同
  • 在你的restController上,尝试在RequestVO之前添加@RequestBody updateDate(@RequestBody RequestVO requestVO) {
  • 你有没有试过@user7294900
  • @NaFelixWimpyWijaya 是的,请参阅 avi 答案的评论

标签: java spring datetime spring-restcontroller


【解决方案1】:

试试@JsonDeserialize

 @JsonDeserialize(using = DateHandler.class)
  private Date publicationDate;

日期处理类

class DateHandler extends StdDeserializer<Date> {

  public DateHandler() {
    this(null);
  }

  public DateHandler(Class<?> clazz) {
    super(clazz);
  }

  @Override
  public Date deserialize(JsonParser jsonparser, DeserializationContext context)
      throws IOException {
    String date = jsonparser.getText();
    try {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      return sdf.parse(date);
    } catch (Exception e) {
      return null;
    }
  }

}

供参考How to deserialize Date from JSON using Jackson

【讨论】:

  • 第一个选项是我的问题,第二个选项是@NikNik 回答,但没有帮助
  • 尝试自定义序列化@JsonDeserialize
【解决方案2】:

您在控制器中错过了@RequestBody,因此该值被视为QueryParam。添加,它会工作。

@PostMapping(value = "path", consumes = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String updateDate(@RequestBody RequestVO requestVO) { // Added Request Body
        logger.debug("requestVO.getStartDate()=" + requestVO.getStartDate());
}

我注意到的另一件事是日期格式"dd.MM.yyyy hh:mm:ss",我认为这不是DateTimeFormatter 的有效格式

有效格式

"yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"

Note : Might have missed some Formats but if any do edit it will be helpful to all

更新

如果您不想要毫秒,我认为 @DateTimeFormat 对您没有帮助,请像其他人建议的那样使用 @JsonFormat。但是您应该更改请求正文的格式,例如

{
 "startDate":"2019-11-11 11:11:11"
}

班级的变化将​​是

 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
 Date startDate;

还研究了格式SimpleDateFormat(@JsonFormat 使用此格式),请参阅SimpleDateFormat - Patterns

【讨论】:

  • 它使用不同的(有效)格式yyyy-MM-dd'T'HH:mm:ss.SSS'Z,但我不能改变它吗?我不需要毫秒
【解决方案3】:

您可以尝试使用:

  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
  private Date start;

并更改所需的格式

【讨论】:

  • 它不起作用,我应该保留@DateTimeFormat 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 2019-01-15
  • 2019-02-14
  • 2017-08-09
  • 1970-01-01
  • 2016-09-16
  • 2014-10-22
相关资源
最近更新 更多