【问题标题】:JsonMappingException: Type id handling not implemented, with enableDefaultTyping and custom serializerJsonMappingException:未实现类型 ID 处理,使用 enableDefaultTyping 和自定义序列化程序
【发布时间】:2019-07-10 12:46:06
【问题描述】:

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

如果我删除默认类型 NON_FINAL,一切正常。

当我添加 NON_FINAL 选项时,我的自定义序列化程序“MySerializer”被调用,并且出现异常 JsonMappingException: Type id handling not implemented

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>

没有 NON_FINAL 默认类型的结果:

{"newNameForFieldA":1}

例外:

线程“主”com.fasterxml.jackson.databind.JsonMappingException 中的异常:类型 id 处理未针对类型 com.test.jackson.main2.MyObject 实现(通过类型为 com.test.jackson.main2.MySerializer 的序列化程序) 在 com.fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1047) 在 com.fasterxml.jackson.databind.JsonSerializer.serializeWithType(JsonSerializer.java:142) 在 com.fasterxml.jackson.databind.ser.impl.TypeWrappedSerializer.serialize(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)

【问题讨论】:

    标签: java jackson jackson-databind


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多