我的控制器看起来像这样:
@RequestMapping(value = "/process_date", method = RequestMethod.GET)
public ResponseEntity processDate
(@RequestParam(value = "time", required = false)
@DateTimeFormat(pattern="yyyy-MM-dd'T'HH:mm:ssXXX") Date date){
// process the date
}
POSTMAN查询:
http://localhost:8080/process_date?date=2014-05-09T00:48:16-04:00
它给了我IllegalArgumentException
。完整的例外是:
{
"timestamp": 1495736131978,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.web.method.annotation.MethodArgumentTypeMismatchException",
"message": "Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.util.Date] for value '2013-05-10T07:48:16-04:00'; nested exception is java.lang.IllegalArgumentException: Illegal pattern component: XXX",
"path": "/airspaces"
}
现在,奇怪的是,当我跑步时:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
try {
System.out.println(df.parse("2013-05-10T07:48:16-04:00"));
} catch (ParseException e) {
System.out.println("PARSE EXCEPTION!!!");
}
它没有任何例外。相同的日期格式,相同的日期。
一种解决方法是将日期作为字符串接收,然后通过解析器方法进行转换。
但是我更关心这里幕后发生的事情。
答案 0 :(得分:0)
尝试在您的模式中使用Z
而不是XXX
。它应该有用。
答案 1 :(得分:0)
请务必更改为@RequestParam(value = "date", required = false)
,因为参数value
与您在Postman中使用的网址参数名称不同。
同时查看您的日志,您正在使用java.util.Date
。您是否考虑过使用新的Java 8 API,而不是java.time.LocalDate
?
答案 2 :(得分:0)
YYYY-MM-DD' T' HH:MM:ssXXX
使用: