JsonMappingException:未实现类型 id 处理,使用enableDefaultTyping 和自定义序列化器

hyp*_*ker 2 java jackson jackson-databind

我使用 Java 9、Jackson-core 和 jackson-databind 2.5.5 我想使用带有 DefaultTyping.NON_FINAL 选项的自定义序列化来在 Json 中编写类名。

如果我删除默认输入 NON_FINAL,一切正常。

当我添加 NON_FINAL 选项时,我的自定义序列化程序“MySerializer”被调用,并且出现异常 JsonMappingException:类型 id 处理未实现

public class Main {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enableDefaultTyping();
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(new MySerializer());

        objectMapper.registerModule(simpleModule);

        System.out.println(objectMapper.writeValueAsString(new MyObject(1)));
    }
}

public class MyObject {
    private int a = 0;

    public MyObject() {
    }

    public MyObject(int a) {
        this.a = a;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
}

public class MySerializer extends StdSerializer<MyObject> {
    protected MySerializer() {
        super(MyObject.class);
    }

    public void serialize(MyObject myObject, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeStartObject();
        jsonGenerator.writeNumberField("newNameForFieldA", myObject.getA());
        jsonGenerator.writeEndObject();
    }
}


    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.5.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.5</version>
        </dependency>
    </dependencies>
Run Code Online (Sandbox Code Playgroud)

没有 NON_FINAL 默认输入的结果:

{“newNameForFieldA”:1}

例外:

线程“main”中的异常 com.fasterxml.jackson.databind.JsonMappingException:未在 com.test.jackson.main2.MyObject 类型(由 com.test.jackson.main2.MySerializer 类型的序列化程序)实现类型 id 处理。 fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1047)在com.fasterxml.jackson.databind.JsonSerializer.serializeWithType(JsonSerializer.java:142)在com.fasterxml.jackson.databind.ser.impl.TypeWrappedSerializer。序列化(TypeWrappedSerializer.java:32)在com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:129)在com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3387)在com .fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2781) 在 com.test.jackson.main2.Main.main(Main.java:18)

小智 6

当启用 DefaultTyping.NON_FINAL 时,如果定义了自定义序列化程序,则 objectMapper 将使用“JsonSerializer”类中定义的方法“serializeWithType”来执行序列化工作。

所以要解决这个问题,需要重写方法“serializeWithType”。