feign.codec.EncodeException: class ArrayListHashMap is not a type supported by this encoder

xiaoxiao2025-09-18  6

Storm中使用Fegin,因为Storm是通过拓扑自己创建和管理Bolt的,所以在Bolt中使用到了某个FeignClient就无法通过@Service,然后通过@Autowired获取到FeginClient的实例。

使用下面的代码来实例化FeginClient,

/** * 初始化SanService的FeginClient * @param url * @return */ public static SanService initializeSanServiceFegin(String url) { SanService service = Feign.builder() .contract(new SpringMvcContract()) .target(SanService.class, url); return service; }

但会报下面的错误异常:

feign.codec.EncodeException: class is not a type supported by this encoder

因为默认的Encoder不支持List或Map,所以报错。

如果自定义Encoder,则必须要用到Feign 依赖包中其他的类,而且需要通过@Autowired依赖注入其他类,但上面提到了,Storm中无法通过@Autowired依赖注入。

终极解决办法:

/** * 初始化SanService的FeginClient * @param url * @return */ public static SanService initializeSanServiceFegin(String url) { HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(new ObjectMapper()); ObjectFactory<HttpMessageConverters> converter = ()-> new HttpMessageConverters(jsonConverter); SanService service = Feign.builder() .encoder(new SpringEncoder(converter)) .decoder(new SpringDecoder(converter)) .contract(new SpringMvcContract()) .target(SanService.class, url); return service; }

 

转载请注明原文地址: https://www.6miu.com/read-5036550.html

最新回复(0)