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

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

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值