Feign 傳參問題及傳輸Date類型參數的時差 坑


Feign 傳參問題及傳輸Date類型參數的時差 坑

feign的調用如下:

List<LeftSeatCountOfDaysResp> getLeftSeatCountOfDays( @RequestParam("configType") Integer configType, @RequestParam("courseId") Long courseId, @RequestParam("startDateFrom") Date startDateFrom, @RequestParam("startDateTo") Date startDateTo, @RequestParam("level") Integer level); 

我們采用了兩個date類型的參數傳參,結果:
我們傳入的時間為:
這里寫圖片描述
但服務端接受到的時間為:
這里寫圖片描述
天啊擼,竟然出現了我們並不熟悉的14h時差,並不是我們熟悉的8個小時。feign真是天坑啊。這是SpringCloud Feign傳Date類型參數的時差導致的。

備注:使用date類型傳參,如果是body里面用對象傳,是不會出現時差問題的。

下面說說兩種解決方案:

  1. 當發送時間類型時,直接用String發送(推薦)
  2. Feign客戶端實現FeignFormatterRegistrar接口自定義DateFormatRegister
@Component public class DateFormatRegister implements FeignFormatterRegistrar{ public DateFormatRegister(){ } @Override public void registerFormatters(FormatterRegistry registry) { registry.addConverter(Date.class, String.class, new Date2StringConverter()); } private class Date2StringConverter implements Converter<Date,String>{ @Override public String convert(Date source) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(source); } } } 

服務端實現:

@Configuration public class WebConfigBeans { @Autowired private RequestMappingHandlerAdapter handlerAdapter; /** * 增加字符串轉日期的功能 */ @PostConstruct public void initEditableValidation() { ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) handlerAdapter .getWebBindingInitializer(); if (initializer.getConversionService() != null) { GenericConversionService genericConversionService = (GenericConversionService) initializer .getConversionService(); genericConversionService.addConverter(String.class, Date.class, new String2DateConverter()); } } } 

第二種比較麻煩,但是一勞永逸,代碼的優雅性比第一種好。但個人而言,還是推薦使用第一種。

Feign 傳參時候使用@DateTimeFormat注解 坑
@NotNull @MyFuture @DateTimeFormat(pattern = "yyyy-MM-dd") private Date appointDate; //預定的預成班日期 

比如這個字段,服務端上面用了@DateTimeFormat注解,這樣的話,springMVC手機支持直接傳字符串2018-03-03自動轉換的。但是,但是,如果你是用client調用,那就不報錯啦,報錯啦。所以使用的時候,一定要注意啊,一定要注意啊。

總結:

雖然fiegn有很多坑,但咱不能說feign不好用。畢竟他比restTemplate或者httpClient還是優雅很多的,能夠簡化很多東西,負載均衡也做得不錯,畢竟在本地就可以做。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM