• 阿里二面:有一个 List 对象集合,如何优雅地返回给前端?


    26b8bc99fe420122b0796dce170f06a5.jpeg

    1.业务背景

    业务场景中,一个会话中存在多个场景,即一个session_id对应多个scene_id和scene_name

    如果你写成如下的聚合模型类

    public  class SceneVO {
      private String sessionId;
      private String sceneId;
      private String sceneName;
      // 省略对应的getter和setter方法
    }

    返回的List形式如下,这个数据在data属性中

    {
      "data":[
      {
        "sessionId":  "jksadhjksd",
        "sceneId": "NDJWKSDSJKDKED",
        "sceneName": "场景1"
      },
      {
        "sessionId":  "jksadhjksd",
        "sceneId": "KLJSDJKLSDFALK",
        "sceneName": "场景2"
      },
      {
        "sessionId":  "jksadhjksd",
        "sceneId": "KERFJKOVDJKDSS",
        "sceneName": "场景3"
      }
     ]
    }

    每个对象里面都带上了重复的一个sessionId数据,我想提出来该怎么办?

    我想改为如下形式,sessionId提出到外层,更能体现出一个sessionId对应多个sceneId和sceneName的含义,这样也便于前端取数据,不然每个对象都要增加一个sessionId属性,太麻烦。

    {
      "data": {
       "sessionId":  "jksadhjksd",
       "sceneList": [
       {
         "sceneId": "NDJWKSDSJKDKED",
         "sceneName": "场景1"
       },
       {
         "sceneId": "KLJSDJKLSDFALK",
         "sceneName": "场景2"
       },
       {
         "sceneId": "KERFJKOVDJKDSS",
         "sceneName": "场景3"
       }
      ]
     }
    }

    2.实体类

    方法如下,首先创建两个实体类。

    public  class SceneVO {
      private String sessionId;
      private List sceneList;
      // 省略对应的getter和setter方法
    }
    public  class SubSceneVO {
      private String sceneId;
      private String sceneName;
      // 省略对应的getter和setter方法
    }

    3.自定义Mapper和xml文件

    public  interface BusinessScenesCustomMapper {
      SceneVO selectBySessionId(String sessionId);
    }



        
            
        
            
                
                
            
        


        
            select session_id, scene_id, scene_name
            from 表名
            where session_id = #{sessionId,jdbcType=VARCHAR}
        

    • collection标签: 用于定义关联的List集合类型的封装规则
    • property属性: 对应父类中List集合的变量名,这里SceneVO类里的List变量名为sceneList
    • ofType属性: 集合存放的类型,List集合要装的类的类名,这里是SubSceneVO

    4.Service层

    public  interface SceneService {
      /**
     * 获取场景信息
     */

      SceneVO getScenesInfo(String sessionId);
    }
    @Service
    public  class SceneServiceImpl {

      @Resource
      private BusinessScenesCustomMapper businessScenesCustomMapper;
     ......
      public SceneVO getScenesInfo(String sessionId) {
       return businessScenesCustomMapper.selectBySessionId(sessionId);
     }
    }

    5.Controller层

    ......
    @Resource
    private SceneService sceneService;

    @GetMapping( "/getScenesInfo")
    public ResModel getScenesInfo(String sessionId) {
     SceneVO sceneVO = sceneService.getScenesInfo(sessionId);
      return ResModel.ok(sceneVO);
    }
  • 相关阅读:
    抽象工厂模式
    Util应用框架基础(二) - 对象到对象映射(AutoMapper)
    RK3568+鸿蒙工控板工业网关视频网关解决方案
    使用Docker搭建MongoDB 5.0版本副本集集群
    操作系统第三周
    与分类有关的一种时序优先现象
    “/home/test/cc/bk-server/docker-compose.yml“ docker配置
    打patch 命令
    【java进阶02:抽象类和接口】类与类之间的关系 抽象类与接口的区别
    【Flink】入门Demo实现、Flink运行架构之运行时组件,任务提交流程,任务调度原理
  • 原文地址:https://blog.csdn.net/m0_70952941/article/details/126686392