FeignClient使用问题(一)

问题描述:

首先这个项目起始是参考前人做的一个项目拷贝过来修改的,所以在对于接口的书写方式几乎是无异的,除了他们项目引用了更多的jar包以外;然后就按部就班地使用了feignclient开始了服务调用,可是并没有像他们项目过得那么顺利,总是在client接口调用处遇到了传参的问题。

 

①前人不需要指定请求方式,可是我这边必须要给他指定一下方式,不然默认是get方式;

②对于这个RequestParam注解导致的400、415等问题一直是没有发现的;刚开始在考虑是否是包名类名需要完全一致等原因,排除这个的可能后;先用简单参数传输,依然不行。

③在参考了网上博客的“深入理解FeignClient”之后,

https://blog.csdn.net/forezp/article/details/73480304 加入了

 

com.netflix.feign 

feign-httpclient 

RELEASE 

的依赖,经测试解决了传输问题,但是只能支持字符串传输,对于对象依然会报400的问题。

④取消掉对于第③步引用的jar解决的部分问题;新建一个简单工程测试排除原工程可能出现的spring加载顺序引起的异常情况;简单jar引用,比较坑的是对于client接口和controller层都是拷贝原工程的代码;这个时候出现了新的问题,因为在进行这个新简单工程的package时出现了一个不重要的报错(说的是简单工程与原工程的名称相同),项目可以正常启动,但只能用jar启动。

⑤然后和原来一样进行post,这时出现了controller层面的400参数问题,

(MissingServletRequestParameterException",
"message":"Required WaterBillDtoNoPassword parameter 'waterBillVo' is not present)

然后就想放弃这个简单工程回到原工程进行post,发现原工程这时也出现了同样的错误,但是在建简单工程之前原工程的controller层可以,client层报的400。

 

 

 

⑥这个时候请同事帮忙看,在一番检阅下,我建议先去掉valid注解尝试,结果不行,好在controller层面处理比client层的调用的可见度要来的高,可是即使是在dispatcherservlet的断点查看并没发现问题,所以只能怀疑注解的问题了;我发现RequestParam这个注解除了对于传参取别名和部分校验外没什么用处,就去掉了这个注解,结果就成了;发现与controller类似的client层也应该是这个注解产生的问题,经验证确实是;比较奇怪的是前人做的那个项目竟然没有报这些错误。

 

 

总结:

经过查阅、思考和检验,这个问题受多余注解的干扰,需要明确requestbody和requestparam的用法,requestbody注解用于传输对象、集合;而requestparam注解用于传输单条参数并起别名和是否必须。

⑦超时问题:从报错中判断超时类型是ribbon还是hystrix

# ribbon

# 请求处理的超时时间
ribbon.ReadTimeout: 120000

# 请求连接的超时时间
ribbon.ConnectTimeout: 30000

hystrix

feign.hystrix.enabled: true
# hystrix 熔断机制
hystrix:
  shareSecurityContext: true
  command:
    default:
      circuitBreaker:
        sleepWindowInMilliseconds: 100000
        forceClosed: true
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 600000

 

 

==

你可能感兴趣的:(问题记录)