java - Jackson key 解串器未被调用/识别

标签 java serialization jackson mixins

即使在实现了自定义 key 反序列化器之后,我仍然收到此错误。调用处理程序链时发生以下错误:

JsonMappingException with message 'Can not find a (Map) Key deserializer for type 
[simple type, class com.abc.xyz.da.kg.types.Attribute] 
(through reference chain: com.abc.xyz.da.kg.services.models.RelationshipBean2["entities"])' 

RelationshipBean2

public class RelationshipBean2 {
     private ArrayList<Entity> entities;
     private String searchFilterQuery;
     private int resultCount;
     private Map<StructuralFeature, List<Object>> documentAttributeValues;
   // getters and setters

引用链 - 实体是从另一个推理元素扩展的接口(interface)。在实现 Element 的类中,我有以下 Map。我已经为 Element 编写了一个 Mixin 类,并带有以下注释。

protected Map<Attribute, Object> attributeValues = new HashMap<Attribute, Object>();

这张 map 是异常的根源:-

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")

public abstract class ElementMixin implements Element {

@JsonDeserialize(keyUsing = AttributeKeyDeserializer.class)
protected Map<Attribute, Object> attributeValues = new HashMap<Attribute, Object>();
}

我已经实现了 key 反序列化器,并使用 SimpleModule 将其注册到 ObjectMapper。

我的解串器:-

public class AttributeKeyDeserializer extends KeyDeserializer {

public AttributeKeyDeserializer() {
    super();
}


@Override
public Object deserializeKey(String content, DeserializationContext context)
            throws IOException, JsonProcessingException {
   // ObjectMapper mapper = (ObjectMapper) context.getParser().getCodec();
   // Attribute attribute = mapper.readValue(content, Attribute.class);
   // return attribute.getID();
   return "Attr";
}

ObjectMapper 配置和反序列化器注册:-

final ObjectMapper mapper = new ObjectMapper();

MixinModule mixinModule = new MixinModule("KGMixinModule", new Version(1,
            0, 0, "SNAPSHOT"));
StructuralFeatureDeserializer structuralFeatureDeserializer = new StructuralFeatureDeserializer();
mixinModule.addDeserializer(StructuralFeature.class,
            structuralFeatureDeserializer);
mixinModule.addKeyDeserializer(StructuralFeature.class,
            new StructuralFeatureKeyDeserializer());
mixinModule.addKeyDeserializer(Attribute.class,
            new AttributeKeyDeserializer());
mapper.registerModule(mixinModule);

AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary,
            secondary);
mapper.setAnnotationIntrospector(pair);

// Set up the provider
JacksonJaxbJsonProvider jaxbProvider = new JacksonJaxbJsonProvider();
jaxbProvider.setMapper(mapper);

这里 MixinModule 扩展自 Jackson 的 SimpleModule

有人可以指出我缺少什么吗?为什么没有调用解串器。我一直在为此苦苦挣扎。

更多背景信息: 我正在尝试在我不拥有的 API 之上编写 REST api,因此修改这些类超出了范围。 我只能使用 Jackson v1.9.13

任何帮助将不胜感激。

最佳答案

我终于发现问题所在了。我在父类(super class)混合中添加了带注释的 Map 字段,而该字段实际上存在于子类之一中。我假设 Mixin 类会在 Super 类中添加该字段。

最后,我为该子类创建了一个 Mixin 类,并在其中添加了带注释的字段,一切正常。

关于java - Jackson key 解串器未被调用/识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29485242/

相关文章:

java - 使用 USB 和 Java 检测电流

java - 如何让两个客户互相聊天?

.net - 如何序列化指向被覆盖的虚拟方法基础的委托(delegate)?

Java:通用序列化方法

java - 具有多级多态类型层次结构的 Jackson 反序列化器

java - jackson :将未初始化的集合字段序列化为空

java - IntelliJ IDEA 无法加载 - 卡在启动屏幕上

java - 用 Java 编写简单的 JSON 响应

java - 在 Micronaut 休息端点的 JSON 中包含 null 和空属性

java - 如何确保该方法仅从一个线程执行一次?