Java接口泛型参数打印输出Object@哈希值问题排查
问题产生原因
两个核心机制共同导致了这个现象:
- 第一是Java泛型的类型擦除特性:你写的方法参数
public <T> void create(T data)里的泛型T仅在编译阶段做类型校验,编译完成后泛型信息会被完全擦除,运行时Spring MVC解析这个方法参数时,能识别到的参数实际类型只有最顶层的java.lang.Object,没有任何具体类型信息,根本没法做针对性的类型转换和参数绑定。 - 第二是Spring MVC的默认参数解析规则:你没有给
data参数加任何参数绑定注解(比如@RequestParam、@RequestBody、@ModelAttribute),当参数类型是无具体信息的Object时,Spring找不到对应的参数解析器来把form-data里传入的键值对映射到这个参数上,只会直接实例化一个空的原生Object对象赋值给参数。这就是为什么你不管传字符串还是数值,打印出来都是java.lang.Object@xxxx格式的对象内存地址,完全拿不到实际传入的参数值。
修复方案
不要用无边界的泛型作为接口方法的接收参数,根据你传参的格式选择对应的写法:
- 如果是传form-data格式的键值对:直接用
@RequestParam Map<String, Object>接收所有传入参数,或者定义和传参字段匹配的自定义实体类作为参数类型,Spring会自动完成字段映射。
示例代码:@PostMapping public void create(@RequestParam Map<String, Object> data) { System.out.println(data); } - 如果是传JSON格式的请求体:给参数加上
@RequestBody注解,同样用具体的Map或者自定义实体类接收,不要用裸泛型。
内容的提问来源于stack exchange,提问作者HibaHasan
相关产品推荐
相关产品推荐

