杰克逊 - 悬停地图实现



所以,我有配置

.defaultTyping(NON_FINAL)

正确编写正确序列化的json为:

"headers": [
        "org.springframework.messaging.MessageHeaders",
        {

现在,问题是MessageHeaders类正在实现映射,但也覆盖了方法,因此它会引发异常。为了适当地进行此序列化,我需要Eaither才能将其序列化为Hashmap,因此:

"headers": [
        "java.util.HashMap",
        {

或能够明确地将MessageHeaders作为Hashmap(因为它实际上只是映射。

再次问题是:如何序列化对象将映射实现为哈希姆普,或者如何使对象实现映射为哈希姆普。

好吧,我找到了如何使用自定义序列化器进行此操作(诀窍是告诉Serialializer使用java.util.hashmap而不是真实类名称):

public class MessageHeadersJsonSerializer extends JsonSerializer<MessageHeaders>{
    @Override
    public void serializeWithType(MessageHeaders value, JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {
        typeSer.writeTypePrefixForObject(value, gen, HashMap.class);
        serialize(value, gen, serializers);
        typeSer.writeTypeSuffixForObject(value, gen);
    }
    @Override
    public void serialize(MessageHeaders value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        for(Map.Entry<String, Object> entry : value.entrySet()){
            gen.writeFieldName(entry.getKey());
            gen.writeObject(entry.getValue());
        }
    }
}

然后将其注册为Mixin:

@JsonSerialize(using = MessageHeadersJsonSerializer.class)
public abstract class MessageHeadersMixIn {}

在父对象上,我可以将其作为hashmap:

public abstract class GenericMessageMixIn<T> {
    @JsonCreator
    public GenericMessageMixIn(
            @JsonProperty("payload") T payload,
            @JsonProperty("headers") Map<String, Object> headers
    ){}
}

最后所有工作都可以!

最新更新