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; }