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里面用對象傳,是不會出現時差問題的。
下面說說兩種解決方案:
- 當發送時間類型時,直接用String發送(推薦)
- 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還是優雅很多的,能夠簡化很多東西,負載均衡也做得不錯,畢竟在本地就可以做。