使用feign時,一般會編寫一個接口類作爲方法來進行調用。如
String say(@RequestParam("time")LocalDateTime time);
在處理jsr310規定的LocalDate、LocalDateTime時,feign默認的序列化方式是相當於進行.toString()。
以LocalDateTime爲例子,參數實際序列化後的樣式是類似以下樣式的
2018-01-01T00:00:00.000
這是ISO標準規定的樣式,但是卻往往不是我們系統中需要的樣式,通常我們需要的樣式是
2018-01-01 00:00:00
這時候,就需要註冊一個額外的轉化器來進行轉化
@Configuration
public class FeignFormatterRegister implements FeignFormatterRegistrar {
@Override
public void registerFormatters(FormatterRegistry registry) {
registry.addFormatter(new LocalDateTimeFormatter());
}
public class LocalDateTimeFormatter implements Formatter<LocalDateTime> {
@Override
public LocalDateTime parse(String text, Locale locale) {
return LocalDateTime.parse(text);
}
@Override
public String print(LocalDateTime date, Locale locale) {
return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
}
通過註冊這個Formatter,就可以實現自定義的樣式輸出。
在provider端,則使用以下代碼進行處理。
@RequestMapping("/say")
@ResponseBody
public LocalDateTime say(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime time){
return time;
}
注意!@RequestParam註解是必須的!
這點和String\Integer等"基本"類型不一樣,spring對於"基本"類型是視爲默認帶有 @RequestParam(required=false,name=參數名) 註解來進行處理的。
而對於jsr310支持的日期時間類型,需要加入@RequestParam才能正確處理,否則會拋出以下異常
java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()