有个合作方的接口要求是通过form表单(application/x-www-form-urlencoded)的形式提交
1 | "partner", url = "${partner.url}") (name = |
本以为只要加个相应的ContentType就能解决,没想到还是too young too simple
1 | feign.codec.EncodeException: Could not write request: no suitable HttpMessageConverter found for request type [com.demon.com.partner.entity.param.CommentSubmitParam] and content type [application/x-www-form-urlencoded] |
查了下资料,需要添加FormEncoder
1 | public class FeignEncoderConfig { |
如果全局使用加个@Configurable的注解即可;而我的需求是只针对部分Client,所以还要在FeignClient上指定配置:
1 | "partner", url = "${partner.url}", configuration = FeignEncoderConfig.class) (name = |
发起请求的时候又碰到了参数缺失的问题:
只好进到FormEncoder里跟一下,在FormEncode的encode里使用的是PojoUtil的toMap方法
1 | data = PojoUtil.toMap(object); |
toMap的实现:
1 | val type = object.getClass(); |
可以看到PojoUtil使用的获取对象属性用的是object.getClass().getDeclaredFields()————这个方法只会获取当前类里定义的属性,而不会获取父类里的属性!
而请求里丢失的参数正好都是父类的!
看来,要么自己写一个FormEncoder,要么就只使用非继承的POJO,而我选择后者!^_^