Java CosmosDB: How to fix Jackson MismatchedInputException for deserializing value from Object value (token `JsonToken.START_OBJECT`)

CHUK Justin 5 Reputation points
2023-06-28T03:19:02.9133333+00:00

I am using the Patch API to patch an object array in CosmosDB in the following format with the patch implementation, but get the error trace below:

protected <T, I> Uni<CosmosItemResponse<T>> patchItemAsync(        I id, String path, T item, Class<T> itemType) {    CosmosPatchOperations operation =            CosmosPatchOperations                    .create()                    .set(path, item);    final String finalPath = path;    final String finalContainerName = containerName;    PartitionKey key = new PartitionKey(Objects.toString(id));    Mono<CosmosItemResponse<T>> result =            cosmosAsyncContainer                    .patchItem(Objects.toString(id), key, operation, itemType)                    .doOnSuccess(cosmosItemResponse ->                            getLogger().info("SUCCEEDED in Patching {} in {}", finalPath, finalContainerName))                    .onErrorMap(fail -> {                        String message = format(                                "Error patching (%s) document: %s",                                finalContainerName,                                fail.getMessage()                        );                        return new DatabaseException(message, fail);                    })                    .doOnError(fail -> {                        getLogger().error(fail.getMessage(), fail);                    });    return Uni.createFrom().publisher(result);}
"enrichments": [                    {                "enrichmentId": "UUID",     ...             }                        ], 


public Uni<EnrichmentResponseData[]> patchEnrichments(        UUID journeyId, EnrichmentResponseData[] enrichmentResponses) {    return patchItemAsync(            journeyId,            "/enrichments",            enrichmentResponses,            EnrichmentResponseData[].class    ).map(CosmosItemResponse::getItem);}



Error patching document: Failed to parse byte-array to POJO. 
at BaseRepository.lambda$patchItemAsync$1(BaseRepository.java:102)
at reactor.core.publisher.Mono.lambda$onErrorMap$28(Mono.java:3763) 	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94) 	at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:258) 	at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:174) 	at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) 	at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) 	at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onNext(FluxMap.java:224) 	at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99) 	at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onNext(FluxRetryWhen.java:174) 	at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245) 	at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305) 	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129) 	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:158) 	at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) 	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) 	at reactor.core.publisher.FluxDoOnEach$DoOnEachSubscriber.onNext(FluxDoOnEach.java:173) 	at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99) 	at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onNext(FluxRetryWhen.java:174) 	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:158) 	at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245) 	at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305) 	at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) 	at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107) 	at reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onNext(FluxDoFinally.java:113) 	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) 	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129) 	at reactor.core.publisher.MonoCompletionStage$MonoCompletionStageSubscription.apply(MonoCompletionStage.java:120) 	at reactor.core.publisher.MonoCompletionStage$MonoCompletionStageSubscription.apply(MonoCompletionStage.java:64) 	at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:930) 	at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:907) 	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) 	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073) 	at com.azure.cosmos.implementation.directconnectivity.rntbd.RntbdRequestManager.messageReceived(RntbdRequestManager.java:846) 	at com.azure.cosmos.implementation.directconnectivity.rntbd.RntbdRequestManager.channelRead(RntbdRequestManager.java:195) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) 	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) 	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) 	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) 	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) 	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) 	at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:253) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) 	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) 	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) 	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) 	at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1373) 	at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1236) 	at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1285) 	at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:529) 	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:468) 	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) 	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) 	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) 	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) 	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) 	at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:800) 	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:499) 	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:397) 	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) 	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) 	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.IllegalStateException: Failed to parse byte-array to POJO. 	
at com.azure.cosmos.implementation.Utils.parse(Utils.java:679) 	at com.azure.cosmos.implementation.ItemDeserializer$JsonDeserializer.parseFrom(ItemDeserializer.java:22) 	at com.azure.cosmos.implementation.Utils.parse(Utils.java:692) 	at com.azure.cosmos.models.CosmosItemResponse.getItem(CosmosItemResponse.java:74) 	at nz.govt.customs.thp.nztj.journeymanager.repository.BaseRepository.lambda$patchItemAsync$0(BaseRepository.java:94) 	at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:171) 	... 67 more
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `` from Object value (token `JsonToken.START_OBJECT`)
 at [Source: (byte[])"{"id":""[truncated 681 bytes]; line: 1, column: 1]
	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
	at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1746)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1520)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1467)
	at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.handleNonArray(ObjectArrayDeserializer.java:345)
	at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:196)
	at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:26)
	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4730)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3738)
	at com.azure.cosmos.implementation.Utils.parse(Utils.java:676)

I was wondering where in the patchItemAsync and patchItem methods is the objectmapper called to cause the input exception, and how this problem can be fixed

Azure Cosmos DB
Azure Cosmos DB
An Azure NoSQL database service for app development.
1,901 questions
{count} votes

1 answer

Sort by: Most helpful
  1. CHUK Justin 5 Reputation points
    2023-07-02T21:52:54.67+00:00

    Yes this issue has been resolved. The patch needed to use the proper class to parse the pojo

    return patchItemAsync( journeyId,"/enrichments",enrichmentResponses,JourneyData.class).map(CosmosItemResponse::getItem);
    
    
    0 comments No comments

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.