泛型引起的dubbo序列化报错
先看报错:
11:22:32.744 [DubboServerHandler-10.17.0.21:20880-thread-11] WARN o. a. d. r. e. c. ExchangeCodec - [?, ?] - [DUBBO] Fail to encode response: Response [id=2226949359259101571, version=2.0.2, status=20, event=false, error=null, result=AppResponse[value=com.xxx.Response@3d5112e2, exception=nul1]], send bad_response info instead, cause: org.apache.dubbo.common.serialize.SerializationException:java.lang.RuntimeException: [Serialization Security] Serialized class com.xxx. xxxDto is not in allow list.
Current mode is `STRICT`, will disallow to deserialize it by default. Please add it into security/serialize. allowlist or follow FAQ to configure it
Dubbo 框架在应用启动时,会自动扫描一些特定的路径和组件,尝试将遇到的类添加到初始的序列化安全允许列表中。下面的表格概括了 Dubbo 自动扫描的主要范围:
扫描范围 / 条件 | 说明 |
Dubbo 内置组件与接口 | Dubbo 自身的 API、通用类型等会被自动包含。 |
Spring 容器中管理的 Bean 类型 | 特别是那些被 @Service、@Component 等注解的类及其依赖类型。 |
已注册的序列化类 | 某些序列化实现(如 Kryo)可能通过类注册机制预先知道一些类型。 |
Java 标准库中的核心类 | 如 String、Integer、Map、List 等常见类型。 |
Dubbo接口的返回值是泛型Response,
当方法定义为Response detail(Long id);
而返回为 Response<xxxDto>,那么xxxDto就会出现序列化报错。
解决方法是将dubbo方法定义改为:Response<xxxDto> detail(Long id);
定义指定泛型具体的类型,就能被dubbo框架扫描到,自动加入到allowlist。
