Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MismatchedInputException deserializing undefined #226

Closed
marquiswang opened this issue Jul 18, 2022 · 3 comments
Closed

MismatchedInputException deserializing undefined #226

marquiswang opened this issue Jul 18, 2022 · 3 comments
Milestone

Comments

@marquiswang
Copy link

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;
    }
rlodge added a commit that referenced this issue Jul 22, 2022
@rlodge
Copy link
Contributor

rlodge commented Jul 22, 2022

Deployed another snapshot that should take care of this one.

@rlodge rlodge added this to the 4.5.1 milestone Jul 22, 2022
@rlodge
Copy link
Contributor

rlodge commented Jul 22, 2022

Fix deployed 4.5.1 and 4.7.0

@rlodge rlodge closed this as completed Jul 22, 2022
@marquiswang
Copy link
Author

Thank you @rlodge !!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants