bson4jackson: Error when trying to deserialize BSON into a EXISTING_PROPERTY polymorphic class

I ran into an problem when trying to deserialize BSON into a polymorphic class that uses JsonTypeInfo.As.EXISTING_PROPERTY.

Groovy script:

@Grab('de.undercouch:bson4jackson:2.7.0')

import com.fasterxml.jackson.annotation.JsonSubTypes
import com.fasterxml.jackson.annotation.JsonTypeInfo
import com.fasterxml.jackson.databind.ObjectMapper
import de.undercouch.bson4jackson.BsonFactory
import de.undercouch.bson4jackson.BsonModule

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = 'type')
@JsonSubTypes([
    @JsonSubTypes.Type(name = 'a', value = A),
    @JsonSubTypes.Type(name = 'b', value = B)
])
abstract class Base {
    UUID id
    String type
}

class A extends Base {}

class B extends Base {}


def mapper = new ObjectMapper(new BsonFactory()).registerModule(new BsonModule())
def bytes = mapper.writeValueAsBytes(new A(id: UUID.randomUUID()))
mapper.readValue(bytes, Base)

Throws the stacktrace:

Caught: com.fasterxml.jackson.core.JsonGenerationException: BsonSerializer can only be used with BsonGenerator
com.fasterxml.jackson.core.JsonGenerationException: BsonSerializer can only be used with BsonGenerator
        at de.undercouch.bson4jackson.serializers.BsonSerializer.serialize(BsonSerializer.java:37)
        at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)
        at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2436)
        at com.fasterxml.jackson.databind.util.TokenBuffer.writeObject(TokenBuffer.java:849)
        at com.fasterxml.jackson.databind.util.TokenBuffer.copyCurrentEvent(TokenBuffer.java:1006)
        at com.fasterxml.jackson.databind.util.TokenBuffer.copyCurrentStructure(TokenBuffer.java:1048)
        at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:97)
        at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:142)
        at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:42)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3788)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2872)
        at com.fasterxml.jackson.databind.ObjectMapper$readValue$1.call(Unknown Source)
        at so.run(so.groovy:27)

Hints:

  • When I use JsonTypeInfo.As.PROPERTY the issue goes away.
  • When I don’t register BsonModule the issue goes away.
  • This was occurring on JDK 7 but not JDK 8. After trying to debug a bit, this appears to be because of reflection field order.

About this issue

  • Original URL
  • State: closed
  • Created 8 years ago
  • Comments: 16 (8 by maintainers)

Commits related to this issue

Most upvoted comments

@michel-kraemer Would it be possible to release official 2.8.0, with Jackson 2.8(.6?) dependency? 2.8 has been out for a while.

Ok: implemented these

https://github.com/FasterXML/jackson-databind/issues/1361 https://github.com/FasterXML/jackson-core/issues/318

so that writeEmbeddedObject() should be passed through and this may either solve the problem, or at least make it easier to solve if there are remaining issues. Fixes will be in 2.8.3 as 2.7 did not have matching functionality to use.