Jackson 密钥解串器不是 called/recognized
Jackson key deserializer not being called/recognized
即使在我实现了自定义密钥反序列化器之后,我仍然不断收到此错误。调用处理程序链期间发生以下错误:
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
class
public class RelationshipBean2 {
private ArrayList<Entity> entities;
private String searchFilterQuery;
private int resultCount;
private Map<StructuralFeature, List<Object>> documentAttributeValues;
// getters and setters
引用链 - 实体是从另一个推理元素扩展而来的接口。在实现 Element 的 class 中,我有以下 Map。我已经为 Element 写了一个 Mixin class,带有以下注释。
protected Map<Attribute, Object> attributeValues = new HashMap<Attribute, Object>();
这张地图是异常的来源:-
@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>();
}
我已经实现了密钥反序列化器并使用 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,因此修改那些 classes 超出了范围。
我只能使用 Jackson v1.9.13
如有任何帮助,我们将不胜感激。
我终于找到问题所在了。我在 Super class mixin 中添加了带注释的 Map 字段,而该字段实际上存在于子 class 之一中。我假设 Mixin class 会在 Super class 中添加该字段。
最后,我为那个子 class 创建了一个 Mixin class 并在那里添加了带注释的字段并且一切正常。
即使在我实现了自定义密钥反序列化器之后,我仍然不断收到此错误。调用处理程序链期间发生以下错误:
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
class
public class RelationshipBean2 {
private ArrayList<Entity> entities;
private String searchFilterQuery;
private int resultCount;
private Map<StructuralFeature, List<Object>> documentAttributeValues;
// getters and setters
引用链 - 实体是从另一个推理元素扩展而来的接口。在实现 Element 的 class 中,我有以下 Map。我已经为 Element 写了一个 Mixin class,带有以下注释。
protected Map<Attribute, Object> attributeValues = new HashMap<Attribute, Object>();
这张地图是异常的来源:-
@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>();
}
我已经实现了密钥反序列化器并使用 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,因此修改那些 classes 超出了范围。 我只能使用 Jackson v1.9.13
如有任何帮助,我们将不胜感激。
我终于找到问题所在了。我在 Super class mixin 中添加了带注释的 Map 字段,而该字段实际上存在于子 class 之一中。我假设 Mixin class 会在 Super class 中添加该字段。
最后,我为那个子 class 创建了一个 Mixin class 并在那里添加了带注释的字段并且一切正常。