Ok, so: if you do want `ObjectId` type handled, you will just need to
provide a custom serializer (JsonSerializer), registered for that type:
otherwise it is assumed to be a Bean, and properties discovered. This is
probably the easiest way.

If you just want to ignore all properties with value of ObjectId, there are
couple of ways to do that: `@JsonIgnoreType` annotation on class does it --
in this case you would want to attach it via mix-in.
But Jackson 2.9 adds "config override" support too, something like:

   mapper.configOverride(ObjectId.class).setIsIgnoredType(true);

I hope this helps,

-+ Tatu +-


On Wed, Oct 23, 2019 at 12:26 AM Amit Singh <[email protected]> wrote:

> I have been able to track down the solution to somehow overriding
> expectAnyFormat in VisitorFormatWrapperImpl.java but have no clue how to
> do that. Is there someway I can extend that?
>
> On Tuesday, October 22, 2019 at 8:14:18 PM UTC+5:30, Amit Singh wrote:
>>
>> I was trying to modify how ObjectId is serialized by the Jackson Avro
>> library. Default serializer creates an AVRO having following structure :
>>
>> {
>>     "name" : "id",
>>     "type" : [ "null", {
>>       "type" : "record",
>>       "name" : "ObjectId",
>>       "namespace" : "org.bson.types",
>>       "fields" : [ {
>>         "name" : "counter",
>>         "type" : {
>>           "type" : "int",
>>           "java-class" : "java.lang.Integer"
>>         }
>>       }, {
>>         "name" : "date",
>>         "type" : [ "null", {
>>           "type" : "long",
>>           "java-class" : "java.util.Date"
>>         } ]
>>       }, {
>>         "name" : "machineIdentifier",
>>         "type" : {
>>           "type" : "int",
>>           "java-class" : "java.lang.Integer"
>>         }
>>       }, {
>>         "name" : "processIdentifier",
>>         "type" : {
>>           "type" : "int",
>>           "java-class" : "java.lang.Short"
>>         }
>>       }, {
>>         "name" : "time",
>>         "type" : {
>>           "type" : "long",
>>           "java-class" : "java.lang.Long"
>>         }
>>       }, {
>>         "name" : "timeSecond",
>>         "type" : {
>>           "type" : "int",
>>           "java-class" : "java.lang.Integer"
>>         }
>>       }, {
>>         "name" : "timestamp",
>>         "type" : {
>>           "type" : "int",
>>           "java-class" : "java.lang.Integer"
>>         }
>>       } ]
>>     } ]
>>   }
>>
>> However, MongoDB has following format for ObjectId as per official source
>> <https://github.com/mongodb/specifications/blob/master/source/extended-json.rst#conversion-table>
>> :
>>
>> {"$oid": <ObjectId bytes as 24-character, big-endian
>> *hexstring*>}
>>
>> So ideally, the AVRO, that I want to generate for this, should have the
>> following structure :
>>
>> {
>>         "name" : "oid",
>>         "type" : {
>>           "type" : "string"
>>         }
>>       }]
>> }
>>
>> What I have been able to do so far is to extend the SerializerModifier
>> and use changeProperties to remove all the fields generated by the ObjectId
>> by first comparing the class. However, using this approach, I am not able
>> to create my own property to add to the List<BeanPropertyWriter> which
>> later gets serialized.
>>
>> public class ObjectIdSerializerModifier extends BeanSerializerModifier {
>>
>>     @Override
>>     public List<BeanPropertyWriter> changeProperties(SerializationConfig 
>> config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
>>         if ( beanDesc.getBeanClass().equals(ObjectId.class) ) {
>>             beanProperties.clear(); // I need to add the 'oid' string 
>> element here.
>>         }
>>         return beanProperties;
>>     }
>> }
>>
>>
>> The above code piece fails with the following error :
>>
>> com.fasterxml.jackson.databind.exc.InvalidDefinitionException: "Any" type
>> (usually for `java.lang.Object`) not supported: `expectAnyFormat` called
>> with type [simple type, class org.bson.types.ObjectId]
>>     at
>> com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
>>     at
>> com.fasterxml.jackson.dataformat.avro.schema.VisitorFormatWrapperImpl.expectAnyFormat(VisitorFormatWrapperImpl.java:174)
>>     at
>> com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.acceptJsonFormatVisitor(UnknownSerializer.java:66)
>>     at
>> com.fasterxml.jackson.dataformat.avro.schema.RecordVisitor.schemaFieldForWriter(RecordVisitor.java:178)
>>     at
>> com.fasterxml.jackson.dataformat.avro.schema.RecordVisitor.optionalProperty(RecordVisitor.java:121)
>>     at
>> com.fasterxml.jackson.databind.ser.BeanPropertyWriter.depositSchemaProperty(BeanPropertyWriter.java:839)
>>     at
>> com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.acceptJsonFormatVisitor(BeanSerializerBase.java:863)
>>     at
>> com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.acceptJsonFormatVisitor(DefaultSerializerProvider.java:566)
>>     at
>> com.fasterxml.jackson.databind.ObjectMapper.acceptJsonFormatVisitor(ObjectMapper.java:4046)
>>     at
>> com.fasterxml.jackson.databind.ObjectMapper.acceptJsonFormatVisitor(ObjectMapper.java:4025)
>>     at com.amitds1997.avroserializer.Main.main(Main.java:55)
>>
>> This is probably because I have emptied the List and it no longer
>> contains any elements. So how can I do this? Also, is this the right
>> approach to take or should I modify some other parameters and functions?
>>
> --
> You received this message because you are subscribed to the Google Groups
> "jackson-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/jackson-user/d9e5d38a-ea0b-472d-99f3-88e0e2280eb9%40googlegroups.com
> <https://groups.google.com/d/msgid/jackson-user/d9e5d38a-ea0b-472d-99f3-88e0e2280eb9%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jackson-user/CAGrxA279fBuohPunSvAqdhNKxUDjqd6iHquXV%2B4s_iMv0cJPWg%40mail.gmail.com.

Reply via email to