Dubbo3.0.3的继承于MAP参数类型只能接受2目的解决方案

2023-10-11 17:32

本文主要是介绍Dubbo3.0.3的继承于MAP参数类型只能接受2目的解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我有一个restful返回数据类型,在各项目中应用一直没问题,但用在Dubbo上就出事了:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResponseEntity<T> extends LinkedHashMap<String,Object> implements Serializable {private long id;private int errCode;private String message;private T result;public static <V> ResponseEntity<V> fromResult(long id, V val){ResponseEntity<V> ret = new ResponseEntity<>();ret.result = val;ret.id=id;return ret;}public static ResponseEntity fromErr(long id, int errCode, String message){ResponseEntity ret=new ResponseEntity(id,errCode,message,null);return ret;}@JsonIgnorepublic Map toMap(){Map map= JsonUtils.fromJson(JsonUtils.toJsonString(this), HashMap.class);return map;}

直接报错,

Caused by: java.lang.IllegalArgumentException: [ServiceDefinitionBuilder] Map type [com.freestyle.common.models.ResponseEntity<java.lang.String>] with unexpected amount of arguments [[Ljava.lang.reflect.Type;@3c1f2651].[class java.lang.String]at org.apache.dubbo.metadata.definition.builder.MapTypeBuilder.build(MapTypeBuilder.java:56)at org.apache.dubbo.metadata.definition.TypeDefinitionBuilder.build(TypeDefinitionBuilder.java:56)at org.apache.dubbo.metadata.definition.TypeDefinitionBuilder.build(TypeDefinitionBuilder.java:80)

报错代码

  ParameterizedType parameterizedType = (ParameterizedType) type;Type[] actualTypeArgs = parameterizedType.getActualTypeArguments();int actualTypeArgsLength = actualTypeArgs == null ? 0 : actualTypeArgs.length;if (actualTypeArgsLength != 2) {throw new IllegalArgumentException(MessageFormat.format("[ServiceDefinitionBuilder] Map type [{0}] with unexpected amount of arguments [{1}]."+ Arrays.toString(actualTypeArgs), type, actualTypeArgs));}

搞不懂它为什么只接受2目的泛型,已经submit issue看他们有什么说法,现在只能修改成2目用着

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResponseEntity<V,T> extends LinkedHashMap<String,V>  implements Serializable {private long id;private int errCode;private String message;private T result;public static <V,T> ResponseEntity<V,T> fromResult(long id, T val){ResponseEntity<V,T> ret = new ResponseEntity<>();ret.result = val;ret.id=id;return ret;}public static <V,T>ResponseEntity<V,T> fromErr(long id, int errCode, String message){ResponseEntity<V,T> ret=new ResponseEntity<>(id,errCode,message,(T)null);return ret;}@JsonIgnorepublic Map toMap(){Map map= JsonUtils.fromJson(JsonUtils.toJsonString(this), HashMap.class);return map;}
}

================
后续的解决:
今晚再查阅代码发现TypeBuilder官方有4个实现,具体请参考dubbo里面的META-INF\dubbo\internal\org.apache.dubbo.metadata.definition.builder.TypeBuilder

array=org.apache.dubbo.metadata.definition.builder.ArrayTypeBuilder
collection=org.apache.dubbo.metadata.definition.builder.CollectionTypeBuilder
map=org.apache.dubbo.metadata.definition.builder.MapTypeBuilder
enum=org.apache.dubbo.metadata.definition.builder.EnumTypeBuilder

它针对这四种类型写了TypeBuilder的实现,而因为我自定义的ResponseEntity是extends map的,所以就交由MapTypeBuilder处理,而阿里的老哥相当严谨地认为map必须就2目,没考虑到继承问题。所以只能通过SPI对ResponseEntity进行针对性的TypeBuilder注册:
在自己的模块里面的resources下相应地建立META-INF\dubbo\internal\org.apache.dubbo.metadata.definition.builder.TypeBuilder
里面填上它的实现类:

responseEntity=com.freestyle.common.support.ResponseEntityTypeBuilder

在这里插入图片描述

打开源代码org.apache.dubbo.metadata.definition.TypeDefinitionBuilder,在Statis节打个断点,你会发现这时候tbs装入的是5个实现,也就是成功装入responseEntity的type builder实现类了。
ResponseEntityTypeBuilder其实也很简单,就是复制MapTypeBuilder,把检查2目的代码删除即可。

这篇关于Dubbo3.0.3的继承于MAP参数类型只能接受2目的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/189693

相关文章

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚: