使用Jackson反序列化EnumMap时遇构造失败错误求助
解决Jackson反序列化EnumMap时的"generic (key) type not available"错误
我刚帮你分析了下这个问题,核心原因是Java的类型擦除机制搞的鬼——当你直接用EnumMap.class作为目标类型时,Jackson没法获取到它的泛型键类型(也就是ResultTypeEnum),自然没办法正确构造EnumMap实例,这就是你看到那个错误的原因。
结合你已有的代码,这里有两个靠谱的解决方案:
方案1:直接使用你自定义的DiagnoticResults类(推荐)
你已经编写了DiagnoticResults类,它继承自EnumMap<ResultTypeEnum, byte[]>并且在构造器中明确指定了键类型为ResultTypeEnum.class,这正好解决了Jackson需要知道键类型的问题。只需要修改客户端代码,把返回类型改成DiagnoticResults即可:
public DiagnoticResults getAllResults() { return client.target(subjectURI + "results") .request(MediaType.APPLICATION_JSON) .get(DiagnoticResults.class); }
这样Jackson可以通过DiagnoticResults的构造器信息,直接确定EnumMap的键类型,顺利完成反序列化。
方案2:用GenericType保留泛型类型信息
如果不想依赖自定义类,你可以借助Jersey的GenericType(本质是通过匿名内部类绕过类型擦除),明确告诉Jackson要反序列化的是EnumMap<ResultTypeEnum, byte[]>类型:
public EnumMap<ResultTypeEnum, byte[]> getAllResults() { return client.target(subjectURI + "results") .request(MediaType.APPLICATION_JSON) .get(new GenericType<EnumMap<ResultTypeEnum, byte[]>>() {}); }
这个方式通过匿名内部类保留了泛型的具体类型信息,Jackson就能知道要构造的EnumMap的键是ResultTypeEnum,从而成功反序列化。
另外验证一下你的服务端代码:返回的DiagnoticResults实例是EnumMap的子类,序列化后的JSON结构完全符合EnumMap的键值对格式,所以上面两种方案都能正常工作。
内容的提问来源于stack exchange,提问作者Delmania
相关产品推荐
相关产品推荐

