2017-05-25 98 views
1

我的控制器的請求參數如下:日期爲彈簧安置

@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 
} 

郵遞員查詢:

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!!!"); 
} 

它的工作沒有任何異常。相同的日期格式,相同的日期。

一種解決方法是將日期作爲字符串接收,然後通過解析器方法執行轉換。

但是我更關心這裏幕後發生了什麼。

+1

這可能是因爲轉換器和格式化程序是兩個不同的東西。你已經檢查過這個線程:http://forum.spring.io/forum/spring-projects/web/86986-datetimeformat-for-pathvariable-not-converting? – cristianorbs

回答

0

嘗試在您的模式中使用Z而不是XXX。它應該工作。

+0

它會工作,但它不會允許我發送時區。 –

+0

如果您在時區中刪除分號,它將允許您在請求中使用「-0400」而不是「-04:00」。請檢查這篇文章請https://stackoverflow.com/questions/23251895/how-do-i-get-datetimeformat-working-with-spring-mvc。 – eg04lt3r

0

請確保您更改爲@RequestParam(value = "date", required = false),因爲參數value與您在郵遞員中使用的URL參數名稱不同。

也在查看您的日誌,您正在使用java.util.Date。你有沒有考慮過使用新的Java 8 API,java.time.LocalDate呢?

0

YYYY-MM-dd'T'HH:MM:ssXXX

USE:

YYYY-MM-dd'T'HH:MM:ss.SSSXXX >>> 2017-05-04T12 :08:56.235-07:00

S毫秒 X時區
ISO 8601時區-07; -0700; -07:00