RestController-在反序列化的POJO中使用@DateTimeFormat

时间:2019-06-26 06:18:09

标签: java spring datetime spring-restcontroller

我的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还是必须像示例中那样声明所有参数?

3 个答案:

答案 0 :(得分:1)

尝试@JsonDeserialize

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

DateHandler类

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

答案 1 :(得分:1)

您错过了控制器中的@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

更新

如果您不想使用Millisec,我认为@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

答案 2 :(得分:0)

您可以尝试使用:

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

并更改所需的格式