关于springcloud中使用feign出现LinkedHashMap can not be cast to xxx 的解决方案

本文分享了在使用Feign时如何自定义Decoder和Encoder,以支持复杂的自定义Result对象,避免默认转换为LinkedHashMap的问题。通过配置FeignClient,使用Jackson进行序列化和反序列化,实现更灵活的数据类型转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

扯淡

  • 博主遇到这个问题也很久了,在网上也看了没找到解决方案,一直没时间去解决,最近稍微抽了一点时间研究了一下,分享出来造福众多的码农朋友,feign默认是根据返回的数据解析为LinkedHashMap这种key value的格式,但是我们项目中一般会有自定义的Result<T,E>这样的复杂类型的对象,这样的话,feign就不能像dubbo这样的rpc那样得到我们自己想要的Result<T,E>对象,下面是解决方案:

个人公众号

个人公众号

解决方案 自定义FeignClient,覆盖提供的FeignClient

@Configuration
public class FeignConfig {

   @Bean
   public Decoder feignDecoder() {
       HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(objectMapper());
       ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);
       return new ResponseEntityDecoder(new SpringDecoder(objectFactory));
   }
   @Bean
   public Encoder feignEncoder(){
       HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(objectMapper());
       ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);
       return new SpringEncoder(objectFactory);
   }
   public ObjectMapper objectMapper(){
       ObjectMapper objectMapper = new ObjectMapper();
       objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
       return objectMapper;
   }
}
  • 再附上一段调用的代码 ,需要注意的是在接口上必须加上你需要转化的结果,不然还是 LinkedHashMap
@FeignClient(value = "xxx-service",fallback = UserFacadeFallback.class)
public interface UserFacade {
    @RequestMapping(value = "/user", method = {RequestMethod.POST})
    UserResponse<EnumGeneralResultCode,UserDto> getUserDto(@RequestBody UserDto user);
}

最后

开始愉快的撸码吧 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值