本篇內容介紹了“使用Feign遠程調用時序列化對象失敗怎么解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
最近在搭建一個SpringCloud的微服務時,遇到了一個問題,在使用Feign遠程調用時報錯,返回對象沒有無參構造方法,有其他的含參數的構造方法。
本地自己搭建的微服務目錄大概如下,才剛開始,后續會逐漸補充優化迭代,有興趣的可以fork下地址:
https://github.com/zhanghailang123/MyCloud
給與指導意見。
Eureka:注冊中心服務端,采用Eureka注冊中心
EurekaClientA:其中的一個Eureka服務端,命名有點隨意,相當于一個數據提供中心,暫時沒有使用ORM框架對接數據庫,把相應數據寫死了,目前只是在練習使用為了方便,后續考慮使用SpringJPA,因為Mb用的太多了
FeignZ:feign模塊遠程調用加負載均衡,而且整合了Hystrix熔斷機制,當然目前只做了最簡單的Demo,練習下手感
HystrixDashboard :Hystrix儀表盤,可以關注下當前的服務器狀況

RibbonZ:主要用作于負載均衡,啟動時可以啟動EurekaClientA 多次指定不同的端口號,來測試下負載均衡,一般都是用Feign直接遠程調用,內置了ribbon,這個demo中也是為了測試用的。
TurBineZ:用來監控集群的熔斷情況。
ZuulZ:網關

接下來進入正題。
場景: 在使用Feign遠程調用寫死的數據服務EurekaClientA時,報錯如下
feign模塊如下:

此處為了復現問題,將熔斷邏輯暫時注釋掉

此處報錯信息:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.example.pojo.Student` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
報錯的對象 :org.example.pojo.Student 如下,一個很簡單的bean對象:

那為什么會報這個問題呢 :不存在無參構造函數,序列化失敗
帶著疑問走進報錯的地方:

可以看到是這個地方 canInstantiate()方法校驗沒通過。在此處打個斷點一探究竟

這個校驗里面內容是:

總之都是校驗無參構造函數。如果給調用的student對象加上無參構造函數就可以成功調用。

構造函數就可以成功調用。**
問題倒不是什么大問題,在搭建服務過程中,只有親力親為,切實參與到了,才能感受到各種奇奇怪怪的小問題,也只有這樣自己親自動手,才是收獲最大的。
在使用feign的過程中遇到了一些問題,所以在這里做以下總結
中的方法參數列表中的參數都必須都要打上@RequestParam(“value”) 注解**,否則調用會報405異常,這一點是和controller中不一樣的,controller中的方法只要參數名和前臺傳入的參數鍵名對應上就能自動綁定上參數
復雜類型用必須打上@RequestBody注解
如果參數列表中有復雜類型,請使用Post請求,使用Get請求會報Bad Request錯誤,且需要打上@RequestBody注解,而普通基本類型可以不用打上@RequestParam注解可自動綁定參數
如有其它問題,也歡迎補充,放一下代碼:
api:
@FeignClient("MS-ADMIN-SERVICE")
public interface FixFeignService {
@GetMapping("/fix")
public List<FixInfo> findAll();
@PostMapping("/fix/add")
public int insert(@RequestBody FixInfo fixInfo);
@PostMapping("/fix/limitByParam")
public LayUIPageBean limitByParam(@RequestBody FixInfo fixInfo, @RequestParam("page") Integer page, @RequestParam("limit") Integer limit);
@PostMapping("/fix/delByIds")
public boolean delByIds(@RequestParam("ids[]") Long[] ids);
@GetMapping("/fix/findById")
public FixInfo findById(@RequestParam("id") Long id);
@PostMapping("/fix/update")
boolean update(@RequestBody FixInfo fixInfo);
}service微服務
@RestController
@RequestMapping("/fix")
@Slf4j
public class FixInfoController {
@Autowired
private FixInfoService fixInfoService;
@GetMapping("")
public List<FixInfo> findAll(){
List<FixInfo> all = fixInfoService.findAll();
return all;
}
@PostMapping("/add")
public int insert(@RequestBody FixInfo fixInfo){
return fixInfoService.insert(fixInfo);
}
@PostMapping("/limitByParam")
public LayUIPageBean limitByParam(@RequestBody FixInfo fixInfo,Integer page,Integer limit){
LayUIPageBean layUIPageBean = new LayUIPageBean();
PageHelper.startPage(page,limit);
List<FixInfo> all = fixInfoService.findByParam(fixInfo);
PageInfo<FixInfo> pageInfo = new PageInfo<>(all);
return layUIPageBean.setCount((int)pageInfo.getTotal()).setData(pageInfo.getList());
}
@PostMapping("/delByIds")
public boolean delByIds(@RequestParam("ids[]") Long[] ids){
//log.info("id"+ids[0]);
boolean flag= fixInfoService.delByIds(ids);
return flag;
}
@GetMapping("/findById")
public FixInfo findById(Long id){
return fixInfoService.findById(id);
}
@PostMapping("/update")
public boolean update(@RequestBody FixInfo fixInfo){
return fixInfoService.update(fixInfo);
}
}“使用Feign遠程調用時序列化對象失敗怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。