Java 关于 controller 用 map 接收值 的问题

今天看 MyBatis-Plus 看到有一句话不明白:

不支持以及不赞成在 RPC 调用中把 Wrapper 进行传输
wrapper 很重
传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)

1、不理解 传输wrapper 是什么东西
2、为什么用 map 接收 json 会出问题

3、我这样写有什么隐患吗

    @GetMapping
    public static Map<String, String> getList() {
        Map<String, String> map = new ConcurrentHashMap<>();
        map.put("CDN", createLine("yesno", "CDN网站","").toString());
        map.put("模块", createLine("dropdown", "","php,iis").toString());
        map.put("web配额", createLine("text", "MB","").toString());
        return map;
    }

    /**
     * 用于构建 “Value”
     */
    private static List<String> createLine(String type, String description, String options) {
        List<String> ansList = new ArrayList<>();
        if (!type.isEmpty())  ansList.add("Type = " + type);
        if (!description.isEmpty()) ansList.add("Description = " + description);
        if (!options.isEmpty()) ansList.add("Options = " + options);
        return ansList;
    }

输出结果如下:

{
    "连接数": "[Type = text]",
    "FTP": "[Type = yesno, Description = 是否允许ftp]",
    "附加参数": "[Type = text]"
}

1、RPC是远程过程调用,也就是说http协议中的数据体,在加了wrapper之后会变大,占用带宽。
2、● JavaBean的数据在编译期就会对其进行校验,如果出错会直接提示。而Map的数据则需要到sql层才会进行处理检验。因此如果map的参数名称写错、参数值如果多传乱传只能到sql层才会被发现。
● Map中所拥有的参数个数、类型、每个参数代表的含义对外不透明,团队开发及后期维护难度大
3、

1、在 MyBatis-Plus 文档中所提到的“wrapper”是指查询条件的封装对象,用于构建 SQL 的查询条件。传输 wrapper 意味着在不同的系统间传递这个对象,以便在另一个系统中使用该对象来构建 SQL 查询。这种做法不被推荐,因为这个对象往往会非常庞大,会增加网络传输的负担,同时也会暴露数据层的细节给 RPC 接口调用方,不利于系统的解耦。

2、在 RPC 调用中,一般使用 JSON 格式来传输数据。如果在控制器方法中使用 Map 对象来接收 JSON 数据,那么需要手动进行类型转换和错误处理。而且,使用 Map 作为参数时,IDE 和编译器无法提供代码提示和类型检查,增加了代码的维护难度。

3、对于您提供的代码,使用 Map 返回值本身并没有问题。但是需要注意的是,使用 Map 对象存储数据时,需要保证线程安全。您使用了 ConcurrentHashMap 来确保线程安全,这是正确的做法。另外,对于 createLine 方法,建议使用枚举类型来代替 type 参数,以提供更好的类型安全性。