Skip to content

MismatchedInputException deserializing undefined  #226

Description

@marquiswang

Ran into another error while upgrading from MongoJack 2.x.

I get the following exception if I try to deserialize a document with undefined:

java.lang.RuntimeException: IOException encountered while parsing

	at org.mongojack.internal.stream.JacksonDecoder.decode(JacksonDecoder.java:45)
	at org.mongojack.internal.stream.JacksonCodec.decode(JacksonCodec.java:71)
	at com.mongodb.internal.operation.CommandResultArrayCodec.decode(CommandResultArrayCodec.java:52)
	at com.mongodb.internal.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:60)
	at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:87)
	at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:42)
	at org.bson.internal.LazyCodec.decode(LazyCodec.java:48)
	at org.bson.codecs.BsonDocumentCodec.readValue(BsonDocumentCodec.java:104)
	at com.mongodb.internal.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:63)
	at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:87)
	at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:42)
	at com.mongodb.internal.connection.ReplyMessage.<init>(ReplyMessage.java:51)
	at com.mongodb.internal.connection.InternalStreamConnection.getCommandResult(InternalStreamConnection.java:540)
	at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:425)
	at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:342)
	at com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:116)
	at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:643)
	at com.mongodb.internal.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:71)
	at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:240)
	at com.mongodb.internal.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:226)
	at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:126)
	at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:116)
	at com.mongodb.internal.connection.DefaultServer$OperationCountTrackingConnection.command(DefaultServer.java:345)
	at com.mongodb.internal.operation.CommandOperationHelper.createReadCommandAndExecute(CommandOperationHelper.java:230)
	at com.mongodb.internal.operation.FindOperation.lambda$execute$1(FindOperation.java:666)
	at com.mongodb.internal.operation.OperationHelper.lambda$withSourceAndConnection$2(OperationHelper.java:575)
	at com.mongodb.internal.operation.OperationHelper.withSuppliedResource(OperationHelper.java:600)
	at com.mongodb.internal.operation.OperationHelper.lambda$withSourceAndConnection$3(OperationHelper.java:574)
	at com.mongodb.internal.operation.OperationHelper.withSuppliedResource(OperationHelper.java:600)
	at com.mongodb.internal.operation.OperationHelper.withSourceAndConnection(OperationHelper.java:573)
	at com.mongodb.internal.operation.FindOperation.lambda$execute$2(FindOperation.java:661)
	at com.mongodb.internal.async.function.RetryingSyncSupplier.get(RetryingSyncSupplier.java:65)
	at com.mongodb.internal.operation.FindOperation.execute(FindOperation.java:692)
	at com.mongodb.internal.operation.FindOperation.execute(FindOperation.java:86)
	at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:191)
	at com.mongodb.client.internal.FindIterableImpl.first(FindIterableImpl.java:200)
	at org.mongojack.internal.util.FindIterableDecorator.first(FindIterableDecorator.java:280)
	at DeserializationTest.deserializingUndefined(DeserializationTest.java:102)
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.END_OBJECT`)
 at [Source: (String); byte offset: #UNKNOWN] (through reference chain: Foo["name"])
	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
	at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1741)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1515)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1420)
	at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:73)
	at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:313)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:176)
	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
	at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:2025)
	at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1175)
	at org.mongojack.internal.stream.JacksonDecoder.decode(JacksonDecoder.java:43)
	... 63 more

Can be reproduced with the following code.

I'm using an old Mongo server: v3.6.23, but I'm fairly certain it'll fail with latest as well.

    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Foo {
        private String value;

        public String getValue() {
            return value;
        }

        public void setValue(String name) {
            this.value = name;
        }
    }

    @Test
    public void deserializingNull() {
        final MongoCollection<Document> collection = theDB.getCollection("foo");
        collection.drop();
        collection.insertOne(new Document("value", new BsonNull()));
        final JacksonMongoCollection<Foo> jacksonCollection = JacksonMongoCollection.builder().build(theDB, "foo", Foo.class, UuidRepresentation.STANDARD);
        final Foo foo = jacksonCollection.find().first();
        assert foo.getValue() == null;
    }

    @Test
    public void deserializingUndefined() {
        final MongoCollection<Document> collection = theDB.getCollection("foo");
        collection.drop();
        collection.insertOne(new Document("value", new BsonUndefined()));
        final JacksonMongoCollection<Foo> jacksonCollection = JacksonMongoCollection.builder().build(theDB, "foo", Foo.class, UuidRepresentation.STANDARD);
        final Foo foo = jacksonCollection.find().first();
        assert foo.getValue() == null;
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions