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
- Add test for issue #67 — committed to michel-kraemer/bson4jackson by michel-kraemer 8 years ago
@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.