-
-
Notifications
You must be signed in to change notification settings - Fork 149
Closed
Description
Is it possible to serialize pojo with dynamic fields implemented using @JsonAnyGetter? This currently fails:
static class POJO {
private final Map<String, Object> params = new HashMap<>();
@JsonAnyGetter public Map<String, Object> any() {
return this.params;
}
@JsonAnySetter public void set(String name, Object value) {
this.params.put(name, value);
}
public Object get(String name) {
return this.params.get(name);
}
}
public void testAvro() throws IOException {
ObjectMapper jsonMapper = new ObjectMapper(new JsonFactory());
ObjectMapper avroMapper = new ObjectMapper(new AvroFactory());
AvroSchemaGenerator gen = new AvroSchemaGenerator();
avroMapper.acceptJsonFormatVisitor(POJO.class, gen);
AvroSchema schema = gen.getGeneratedSchema();
POJO orig = jsonMapper.readValue("{\"foo\": \"a\", \"bar\": 2, \"baz\": false}", POJO.class);
byte binary[] = avroMapper.writer(schema).writeValueAsBytes(orig);
POJO clone = avroMapper.reader(POJO.class).with(schema).readValue(binary);
}
That throws following:
Caused by: java.lang.IllegalStateException: No field named 'bar'
at com.fasterxml.jackson.dataformat.avro.ser.ObjectWriteContext._reportUnknownField(ObjectWriteContext.java:132)
at com.fasterxml.jackson.dataformat.avro.ser.ObjectWriteContext.writeFieldName(ObjectWriteContext.java:67)
at com.fasterxml.jackson.dataformat.avro.AvroGenerator.writeFieldName(AvroGenerator.java:285)
at com.fasterxml.jackson.databind.ser.std.StdKeySerializers$StringKeySerializer.serialize(StdKeySerializers.java:220)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:610)
at com.fasterxml.jackson.databind.ser.AnyGetterWriter.getAndSerialize(AnyGetterWriter.java:61)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:694)
... 29 more