我的请求POJO中有一个“生日”属性,它是String。在我的回复POJO中,出生日期属性是joda的DateTime。我通过使用“新的DateTime(requestModel.getDateOfBirth())”将其转换为DateTime。不过,它仅接受日期格式(在String中)为“ yyyy-mm-dd”。当我更改请求日期格式时,它会抛出“ 500
块引用
“。这是我的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格式?感谢您的帮助
问题来源:Stack Overflow
首先,因为你得到的日期没有一天的时间,你应该更喜欢乔达时间的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项目的官方建议说要迁移。
链接 Oracle教程:Date Time说明如何使用java.time。 维基百科文章:ISO 8601
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。