我的请求POJO中有一个“出生日期”属性,它是String。在我的回复POJO中,出生日期属性是joda的DateTime。我通过使用“新的DateTime(requestModel.getDateOfBirth())”将其转换为DateTime。不过,它仅接受日期格式(在String中)为“ yyyy-mm-dd”。当我更改请求日期格式时,它将引发“ 500
Blockquote
“。这是我的POJO:
RequestModel.java
public class RequestModel {
@NotNull(message = "dateOfBirth cannot be null")
private String dateOfBirth;
public RequestModel(String dateOfBirth) {
super();
this.dateOfBirth = dateOfBirth;
}
public String getDateOfBirth() {
return dateOfBirth;
}
}
ResponseModel.java
public class ResponseModel {
private DateTime dateOfBirth;
public ResponseModel( DateTime dateOfBirth) {
super();
this.dateOfBirth = dateOfBirth;
}
public DateTime getDateOfBirth() {
return dateOfBirth;
}
}
MyController.java
@PostMapping(consumes = {
MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE
},
produces = {
MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE
})
public ResponseEntity<ResponseModel> create(@Valid @RequestBody RequestModel requestModel) {
ResponseModel response = new ResponseModel(new DateTime(requestModel.getDateOfBirth()));
return new ResponseEntity<ResponseModel>(response, HttpStatus.CREATED);
}
这是发布的JSON请求,效果很好:
{
"dateOfBirth" : "2012-12-12"
}
以下请求正文引发错误:
{
"dateOfBirth" : "12-12-2012",
}
错误是:
{
"timestamp": "2020-03-14T19:09:51.647+0000",
"status": 500,
"error": "Internal Server Error",
"message": "Invalid format: \"12-12-2012\" is malformed at \"12\"",
"path": "/myPath/"
}
我想知道如何改善控制器逻辑或设计以接受API中的任何Date格式?感谢您的帮助
Date(String date)被弃用的构造函数。
您可以使用Calendar类构建DateTime对象
Calendar c = Calendar.getInstance();
c.set(2000,11,2);
Date d = c.getTime();
System.out.println(d.toString());
这将在2000年12月2日创建一个Date对象。
[您需要先对输入字符串进行拆分和操作,然后再将其传递给get方法
设置方法接受3个参数。
设置(整数年,整数月,整数日期)设置日历字段YEAR,MONTH和DAY_OF_MONTH的值。
有关更多信息,请参见日历API
https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
首先,由于您获得的日期中没有一天中的时间,因此您最好选择Joda-Time的LocalDate
,而不是DateTime
。
第二,构造函数接受的格式(以及LocalDate
构造函数也为国际标准ISO 8601)。我应该说,建议您的客户在他们的请求中使用此格式将是很好的建议。
但是,如果您坚持要使用:使用格式化程序将请求中的字符串解析为LocalDate
。
DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("dd-MM-yyyy");
String requestDateOfBirth = "12-12-2012";
LocalDate dateOfBirth = LocalDate.parse(requestDateOfBirth, dateFormatter);
System.out.println("Date of birth: " + dateOfBirth);
此片段的输出是:
出生日期:2012-12-12
在12-12-2012
中,我不知道是哪个月和哪个月,但是如果需要,您可以在格式模式字符串中将dd
替换为一个月的天,将MM
替换为一个月。
最后,如果这是新代码,您可能更喜欢使用Java.time(现代Java日期和时间API)而不是Joda-Time。 Joda-Time项目的官方建议说要迁移。