RestController - 在反序列化的 POJO 中使用 @DateTimeFormat
RestController - Use @DateTimeFormat inside deserialized POJO
我有 JSON 正文,其中包含我需要反序列化的日期参数
正在关注 Working with Date Parameters in Spring
annotate the parameters with the @DateTimeFormat annotation and provide a formatting pattern parameter:
We can also use our own conversion patterns. We can just provide a pattern parameter in the @DateTimeFormat annotation:
@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());
我POST数据:
{"startDate":"11.11.2019 11:11:11"}
但我的开始日期为空
- 其他参数正常(日期除外)
我可以在 Object 中使用 @DateTimeFormat
还是必须像示例中那样声明所有参数?
您可以尝试使用:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date start;
并更改所需的格式
试试@JsonDeserialize
@JsonDeserialize(using = DateHandler.class)
private Date publicationDate;
日期处理器class
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;
}
}
}
您在控制器中遗漏了@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
suggested.But 你应该更改请求正文的格式,例如
{
"startDate":"2019-11-11 11:11:11"
}
而 class 的变化将是
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
Date startDate;
还查看了格式 SimpleDateFormat
(@JsonFormat
使用此格式),参考 SimpleDateFormat - Patterns
我有 JSON 正文,其中包含我需要反序列化的日期参数
正在关注 Working with Date Parameters in Spring
annotate the parameters with the @DateTimeFormat annotation and provide a formatting pattern parameter:
We can also use our own conversion patterns. We can just provide a pattern parameter in the @DateTimeFormat annotation:
@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());
我POST数据:
{"startDate":"11.11.2019 11:11:11"}
但我的开始日期为空
- 其他参数正常(日期除外)
我可以在 Object 中使用 @DateTimeFormat
还是必须像示例中那样声明所有参数?
您可以尝试使用:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date start;
并更改所需的格式
试试@JsonDeserialize
@JsonDeserialize(using = DateHandler.class)
private Date publicationDate;
日期处理器class
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;
}
}
}
您在控制器中遗漏了@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
suggested.But 你应该更改请求正文的格式,例如
{
"startDate":"2019-11-11 11:11:11"
}
而 class 的变化将是
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
Date startDate;
还查看了格式 SimpleDateFormat
(@JsonFormat
使用此格式),参考 SimpleDateFormat - Patterns