zoukankan      html  css  js  c++  java
  • 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还是优雅很多的,能够简化很多东西,负载均衡也做得不错,毕竟在本地就可以做。

  • 相关阅读:
    android openGL ES2 一切从绘制纹理開始
    HTML5 界面元素 Canvas 參考手冊
    python进阶十_正則表達式(一)
    HDU 3016 Man Down(线段树)
    android 自己定义dialog并实现失去焦点(背景透明)的功能
    上海传智程序员携手设计狮美女雨中烧烤!!
    vim visual操作备忘
    MySQl Study学习之--MySQl二进制日志管理
    Android View measure (三) 经常用法
    Analyze提示:Value stored to &quot;***&quot;is never read
  • 原文地址:https://www.cnblogs.com/javalinux/p/14340603.html
Copyright © 2011-2022 走看看