問題:為啥調(diào)用rpc遠(yuǎn)程服務(wù)后泛源,返回的響應(yīng)類的結(jié)果無法向下轉(zhuǎn)型舟误?具體報錯
java.util.LinkedHashMap cannot be cast to com.huibo.framework.domain.ucenter.ext.AdminLite
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.huibo.framework.domain.ucenter.ext.AdminLite
有博主說關(guān)于springcloud中使用feign出現(xiàn)LinkedHashMap can not be cast to xxx 的問題是因?yàn)椋篺eign默認(rèn)是根據(jù)返回的數(shù)據(jù)解析為LinkedHashMap這種key value的格式,但是我們項(xiàng)目中一般會有自定義的Result<T,E>這樣的復(fù)雜類型的對象,這樣的話,feign就不能像dubbo這樣的rpc那樣得到我們自己想要的Result<T,E>對象瑞凑。
解決用 自定義FeignClient,覆蓋提供的FeignClient腕巡。我覺得不一定有用骚烧,但是用使用fastjson將對象和字符串進(jìn)行轉(zhuǎn)換就可以恢復(fù)原樣顶瞒,不過太消耗性能夸政。
@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;
}
}
// 將對象轉(zhuǎn)換成為字符串
String str = JSON.toJSONString(infoDo);
// 將字符串轉(zhuǎn)換成為對象
InfoDo infoDo = JSON.parseObject(strInfoDo, InfoDo.class);
// 將對象集合轉(zhuǎn)換成為字符串
String users = JSON.toJSONString(users);
//將字符串轉(zhuǎn)換成為對象集合
List<User> userList = JSON.parseArray(userStr, User.class);
都說是feign的問題,但是SpringCloud 復(fù)雜對象接收時候?qū)ο笞兂蒐inkeHashMap榴徐。通過使用泛型參數(shù)守问,實(shí)際類型信息完全丟失到運(yùn)行時并且無法推斷。它本質(zhì)上最終是相同的
Object
坑资。當(dāng)Gson發(fā)現(xiàn)你想要一個Object
類型時耗帕,它使用aMap
來放置JSON信息。這樣袱贮,如果你重新序列化該對象實(shí)例兴垦,數(shù)據(jù)將被保留扁耐。所以在定義接口的時候返回的泛型必須確定捐下。其中BaseResult的范性應(yīng)該為List<UserVO> ,如果沒有寫,那么返回的結(jié)果就會變成List<LinkedHashMap>,這樣就導(dǎo)致一些去參數(shù)錯誤腐螟。
// 錯誤實(shí)例
@PostMapping("/user/queryUserByAccountStatus")
BaseResult queryUserByAccountStatus(@RequestBody AccountsTenantIdStatusArg arg);
// 正確實(shí)例
@PostMapping("/user/queryUserByAccountStatus")
BaseResult<List<UserVO>> queryUserByAccountStatus(@RequestBody AccountsTenantIdStatusArg arg);