【spring boot/spring cloud踩坑記錄】使用feign進行get請求時,對參數中的JSR310日期類進行處理

使用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>()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章