最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決RestTemplate反序列化嵌套對象的問題

 更新時間:2022年11月17日 15:03:31   作者:小樓夜聽雨QAQ  
這篇文章主要介紹了解決RestTemplate反序列化嵌套對象的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

RestTemplate反序列化嵌套對象

假設(shè)某個接口返回的數(shù)據(jù)如下格式

{
  "msg" : "ok",
  "code" : 0,
  "data" : {
    "id" : 1,
    "tasks" : [ {
      "id" : 300,
      "nodeId" : 801,
      "status" : 3,
      "actionName" : "pick",
      "wcsProcessName" : "rgv"
    }, {
      "id" : 301,
      "nodeId" : 720,
      "status" : 3,
      "actionName" : "move",
      "wcsProcessName" : "rgv"
    }, {
      "id" : 302,
      "nodeId" : 720,
      "status" : 3,
      "actionName" : "checker",
      "wcsProcessName" : "checker"
    }, {
      "id" : 303,
      "nodeId" : 801,
      "status" : 3,
      "actionName" : "checker",
      "wcsProcessName" : "checker"
    } ],
    "status" : 3
  }
}

仿寫一個測試接口,用于返回這種格式的數(shù)據(jù)

    @PostMapping("/aiot/task/info")
    public R queryTask(@RequestBody Map map) {
        Integer taskId = (Integer) map.get("taskId");
        Map res = new HashMap();
        res.put("id", taskId);
        res.put("tasks", Arrays.asList(
                new TaskProcess(300, 801, 3, "pick", "rgv"),
                new TaskProcess(301, 720, 3, "move", "rgv"),
                new TaskProcess(302, 720, 3, "checker", "checker"),
                new TaskProcess(303, 801, 3, "checker", "checker")
                ));
 
        res.put("status", 3);
        return R.ok(res);
    }

客戶端的代碼如下

    @Test
    public void test() {
 
        HashMap<String, Integer> map = new HashMap<>();
        map.put("taskId", 1);
        ResponseEntity<WcsR> wcsRResponseEntity = restTemplate.postForEntity("http://localhost:8081/aiot/task/info", map, WcsR.class);
        WcsR wcsR = wcsRResponseEntity.getBody();
    }

方案一

一般情況下,我們會創(chuàng)建一個與服務(wù)端一致的通用值返回對象。

@Data
public class WcsR {
    private String msg;
 
    private Integer code;
 
    private Object data;
}

data的類型無法確定。

在客戶端不知道類型的情況下,我們看下data會被解析成什么

    @Test
    public void test() {
 
        HashMap<String, Integer> map = new HashMap<>();
        map.put("taskId", 1);
        ResponseEntity<WcsR> wcsRResponseEntity = restTemplate.postForEntity("http://localhost:8081/aiot/task/info", map, WcsR.class);
        WcsR wcsR = wcsRResponseEntity.getBody();
        System.out.println(wcsR.getData().getClass().getName());
    }

運行結(jié)果

看后臺的代碼我們可以知道,data是一個對象,里面有三個變量,id(整型),tasks(對象數(shù)組),status(整型)。

下面嘗試獲取這些成員變量

    @Test
    public void test() {
 
        HashMap<String, Integer> map = new HashMap<>();
        map.put("taskId", 1);
        ResponseEntity<WcsR> wcsRResponseEntity = restTemplate.postForEntity("http://localhost:8081/aiot/task/info", map, WcsR.class);
        WcsR wcsR = wcsRResponseEntity.getBody();
        System.out.println(wcsR.getData().getClass().getName());
        LinkedHashMap dataMap = (LinkedHashMap) wcsR.getData();
        System.out.println("id:   " + dataMap.get("id").getClass().getName());
        System.out.println("tasks: " + dataMap.get("tasks").getClass().getName());
        System.out.println("status: " + dataMap.get("status").getClass().getName());
    }

結(jié)果

可以看到,數(shù)組被解析成了Arraylist, 基本類型被解析成對應(yīng)的包裝類型。

數(shù)組里面還是個對象,還會繼續(xù)幫我們解析嗎?測試代碼如下

    @Test
    public void test() {
 
        HashMap<String, Integer> map = new HashMap<>();
        map.put("taskId", 1);
        ResponseEntity<WcsR> wcsRResponseEntity = restTemplate.postForEntity("http://localhost:8081/aiot/task/info", map, WcsR.class);
        WcsR wcsR = wcsRResponseEntity.getBody();
        LinkedHashMap dataMap = (LinkedHashMap) wcsR.getData();
//        System.out.println("id:   " + dataMap.get("id").getClass().getName());
//        System.out.println("tasks: " + dataMap.get("tasks").getClass().getName());
//        System.out.println("status: " + dataMap.get("status").getClass().getName());
        ArrayList tasks = (ArrayList) dataMap.get("tasks");
        System.out.println(tasks.get(0).getClass().getName());
    }

結(jié)果

即使再次嵌套,還是對象還是被解析成了LinkedHashMap。

可以得到結(jié)論,在沒有提供對象類型的情況下,RestTemplate默認情況下是這么幫我們解析的:

所有的對象都解析LinkedHashMap, 數(shù)組解析為ArrayList,基本類型解析為Integer(以及其他的包裝類)。

方案二

為什么說是在“沒有提供對象類型的情況”?

這個例子中,最外層WcsR是我們自己提供的對象,假設(shè)我們提供所有的嵌套對象,

則可以定義以下對象用于接收返回值

最外層對象

@Data
public class WcsR {
    private String msg;
 
    private Integer code;
 
//    private Object data;
 
    private TaskDetail tasks;
}

第二層對象

@Data
public class TaskDetail {
    private Integer id;
 
    private List<TaskProcess>tasks;
 
    private Integer status;
}

第三層對象

@Data
public class TaskProcess {
    private Integer id;
 
    private Integer nodeId;
 
    private Integer status;
 
    private String actionName;
 
    private String wcsProcessName;
}

測試類

    @Test
    public void test() {
 
        HashMap<String, Integer> map = new HashMap<>();
        map.put("taskId", 1);
        ResponseEntity<WcsR> wcsRResponseEntity = restTemplate.postForEntity("http://localhost:8081/aiot/task/info", map, WcsR.class);
        WcsR wcsR = wcsRResponseEntity.getBody();
        System.out.println(wcsR.getData());
        System.out.println(wcsR.getData().getId());
        System.out.println(wcsR.getData().getTasks());
        System.out.println(wcsR.getData().getStatus());
        System.out.println(wcsR.getData().getTasks().get(0));
    }

測試結(jié)果

這種方法也是可以的。

總結(jié)

可以看出,反序列化的方案與SpringMvc的HttpMessageConvert有點類似,如果你提供了對象,則會按照對象的結(jié)構(gòu)反序列化。如果沒有提供變量,則會轉(zhuǎn)化成map、List等結(jié)構(gòu)。

如果接口比較少、字段比較多,可以用第二種方案。

如果接口比較多,字段比較少,并且字段數(shù)量都比較少時,為了避免定義過多的無用類,可以用第一種方案。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • maven打包失敗踩坑的解決方式詳解

    maven打包失敗踩坑的解決方式詳解

    最近因為新項目有很多自定義的jar包,而且占內(nèi)存很多,就直接拷貝過來,新開了一個maven倉庫,用的時候沒有問題,但是打包一直編譯不通過,下面這篇文章主要給大家介紹了關(guān)于maven打包失敗踩坑的解決方式,需要的朋友可以參考下
    2023-05-05
  • 不使用myeclipse注冊機得到myeclipse注冊碼的方法(myeclipse序列號)

    不使用myeclipse注冊機得到myeclipse注冊碼的方法(myeclipse序列號)

    本文為大家介紹不使用myeclipse注冊機就能得到myeclipse注冊碼(序列號)的方法, 運行下面的JAVA代碼就可以了
    2014-01-01
  • Springboot分頁插件使用實例解析

    Springboot分頁插件使用實例解析

    這篇文章主要介紹了Springboot分頁插件使用實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • IDEA編譯報錯:Error:(2048,1024) java: 找不到符號的解決方案

    IDEA編譯報錯:Error:(2048,1024) java: 找不到符號的解決方案

    在使用 Lombok 的過程中,你是否曾遇到過 IDEA 編譯報錯 Error:(2048,1024) java: 找不到符號?下面就讓我們來深入剖析這一問題的根源,并給出相應(yīng)的解決方案,需要的朋友可以參考下
    2025-02-02
  • Java 利用binarySearch實現(xiàn)抽獎計算邏輯

    Java 利用binarySearch實現(xiàn)抽獎計算邏輯

    這篇文章主要介紹了Java 利用binarySearch實現(xiàn)抽獎計算邏輯,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • SpringBoot實現(xiàn)RabbitMQ三種使用方式

    SpringBoot實現(xiàn)RabbitMQ三種使用方式

    本文主要介紹了SpringBoot實現(xiàn)RabbitMQ三種使用方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • MyBatis中resultType屬性的使用

    MyBatis中resultType屬性的使用

    這篇文章主要介紹了MyBatis中resultType屬性的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • MyBatis 引入映射器的方法

    MyBatis 引入映射器的方法

    本文通過實例代碼給大家分享mybatis 引入映射器的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-09-09
  • springboot中報錯Invalid character found in the request的解決

    springboot中報錯Invalid character found in 

    這篇文章主要介紹了springboot中報錯Invalid character found in the request的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 詳解Java 中的 AutoCloseable 接口

    詳解Java 中的 AutoCloseable 接口

    本文對 try-with-resources 語法進行了較為深入的剖析,驗證了其為一種語法糖,同時給出了其實際的實現(xiàn)方式的反編譯結(jié)果,相信你在看完本文后,關(guān)于 AutoCloseable 的使用你會有新的收獲。
    2020-11-11

最新評論

腾冲县| 伊宁县| 河间市| 乐平市| 治县。| 邯郸市| 防城港市| 长治市| 镇江市| 双桥区| 油尖旺区| 雅江县| 搜索| 阿瓦提县| 济源市| 临桂县| 襄城县| 枣庄市| 花莲市| 靖安县| 启东市| 巨鹿县| 雷波县| 公主岭市| 应城市| 凌云县| 河津市| 浦城县| 江陵县| 望江县| 元阳县| 肇庆市| 丹凤县| 长海县| 义马市| 轮台县| 曲麻莱县| 呼伦贝尔市| 贵定县| 靖远县| 昭苏县|