Jackson泛型场景下可变JsonProperty响应映射失效原因求解
问题原因及修复方案
核心原因
1. 泛型类型构造不完整
你当前构造的JavaType仅指定了Response类的泛型参数为Inquiry,但Response内部嵌套的Data本身也是泛型类,你没有显式指定Data的泛型参数类型,导致Jackson反序列化时丢失了Data内部data字段的具体类型信息,无法自动映射为Inquiry实例。
2. 自定义命名策略逻辑错误
DataNamingStrategy的nameForSetterMethod方法实现存在笔误:非匹配场景下你调用了super.nameForGetterMethod,而非对应的super.nameForSetterMethod,导致Jackson无法正确识别Data类属性的setter方法,自然无法完成属性注入。
修复步骤
1. 修正嵌套泛型类型构造
将控制器中构造JavaType的代码替换为如下实现,显式指定嵌套泛型的类型:
// 先构造Data<Inquiry>的参数化类型 JavaType dataJavaType = mapper.getTypeFactory().constructParametricType(Data.class, Inquiry.class); // 再构造Response<Data<Inquiry>>的参数化类型 JavaType responseJavaType = mapper.getTypeFactory().constructParametricType(Response.class, dataJavaType);
2. 修正命名策略的笔误
将DataNamingStrategy类的nameForSetterMethod方法修改为:
@Override public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) { return (defaultName.equals(DATA_FIELD))? fieldName : super.nameForSetterMethod(config, method, defaultName); }
可选优化方案
如果不想依赖全局生效的PropertyNamingStrategy,可以直接把Data类的泛型属性替换为Map<String, T>,反序列化后直接从Map中取对应key的对象即可,无需自定义命名策略,适配性更强:
public class Data<T> { private Map<String, T> data; // Getters Setters }
内容的提问来源于stack exchange,提问作者Atul Kaushik
相关产品推荐
相关产品推荐

