背景:
接收一個springcloud項目,UI模塊訪問其他服務的接口,返回數據統一都是使用fastjson進行轉換,但是新開發了幾個新模塊之后發現fastjson很多bug(各種內存溢出),但是很多地方已經重度依賴fastjson,只是升級改掉了內存溢出的某些代碼,最近突然想起來RestTemplate明明有定義返回值為啥不直接使用,因為我是為了統一規范,按照以前調用模塊的寫法進行開發,于是說試就試:
1. 調用接口(被調用接口我是統一返回json,也就是使用@RestController注解):
ReturnT responseEntity = restTemplate.postForObject("http://THPWPSERVICE/xx", 實體參數, ReturnT.class);
直接使用定義好的統一返回類型ReturnT進行接收返回值,然后訪問頁面無數據,后臺報錯如下:
databind.exc.MismatchedInputException: Cannot construct instance of................
網上各種查詢,發現原因是要想接收指定類型,這個指定類型必須繼承序列化,且還必須有有參構造函數以及午餐構造函數,于是添加@AllArgsConstructor 、@NoArgsConstructor注解再implements Serializable,完整統一返回類型的實體定義如下:
重啟程序,再次訪問終于拿到數據了
以下記錄下一些RestTemplate調用注意事項:
1. 被調用接口如果形參是實體,那么就在實體之前加上注解@RequestBody,否則無法接收到參數
2. 被調用接口如果形參是基礎類型參數(如String、int類型等等),那么就在類型前加上注解@RequestParam,否則無法接收到參數
3. 如果參數非實體類型,那么建議使用get請求? ?:
String json = restTemplate.getForObject("http://XXXSERVICE/getById?id="+id, String.class);
以下是一些常用調用方法:
1. 帶實體入參,使用post請求,layui表格返回值,直接返回json格式即可,無需解析return restTemplate.postForObject("http://THPWPSERVICE/supplies/getItems", form, String.class); 2. 參數少,使用get請求 ,返回json實體,再轉成實體類,再返回頁面String json = restTemplate.getForObject("http://THPWPSERVICE/supplies/getByItemCode?itemCode="+itemCode, String.class);s = JSON.parseObject(json, new TypeReference<SuppliesItem>() {});3. 轉list ids = JSON.parseObject(json, new TypeReference<List>() { });4 . BookDto bookDto = restTemplate.getForObject(url, BookDto.class); -----待嘗試5. ResponseEntity<BookDto> responseEntity = restTemplate.getForEntity(url, BookDto.class); -----待嘗試//狀態碼System.out.println(responseEntity.getStatusCode());//獲取頭System.out.println("頭:" + responseEntity.getHeaders());//獲取bodyBookDto bookDto = responseEntity.getBody();6. ResponseEntity<List<BookDto>> responseEntity = -----待嘗試restTemplate.exchange(url,HttpMethod.GET,null,new ParameterizedTypeReference<List<BookDto>>() {});List<BookDto> bookDtoList = responseEntity.getBody();7. BookDto result = restTemplate.postForObject(url, 參數, BookDto.class);