[JAVA-4620] RecordCodec fails to decode into a component of type java.util.Set Created: 18/May/22  Updated: 08/Oct/22  Resolved: 08/Oct/22

Status: Closed
Project: Java Driver
Component/s: Codecs
Affects Version/s: 4.6.0
Fix Version/s: None

Type: Bug Priority: Minor - P4
Reporter: Gyula Lakatos Assignee: Unassigned
Resolution: Duplicate Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Duplicate
duplicates JAVA-4742 Support record components with more s... Closed

 Description   

Summary

I have a record that looks like this:

 

package com.github.bottomlessarchive.loa.document.repository.domain;
 
import org.bson.codecs.pojo.annotations.BsonId;
 
import java.time.Instant;
import java.util.Collections;
import java.util.Set;
import java.util.UUID;
 
public record DocumentDatabaseEntity(
 
        @BsonId
        UUID id,
 
        String vault,
        String type,
        String status,
        String compression,
 
        String source,
        Set<byte[]> sourceLocations,
 
        byte[] checksum,
        long fileSize,
 
        int downloaderVersion,
        Instant downloadDate
) {
 
 
    public Set<byte[]> sourceLocations() {
        // Older documents doesn't have sourceLocations populated
        return sourceLocations == null ? Collections.emptySet() : sourceLocations;
    }
}

The record is successfully inserted into the database, however, when I want to read it back, I get a java.lang.ClassCastException:

 

 

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:780) ~[spring-boot-2.6.7.jar:2.6.7]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:761) ~[spring-boot-2.6.7.jar:2.6.7]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[spring-boot-2.6.7.jar:2.6.7]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312) ~[spring-boot-2.6.7.jar:2.6.7]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.7.jar:2.6.7]
    at com.github.bottomlessarchive.loa.indexer.LibraryIndexerApplication.main(LibraryIndexerApplication.java:13) ~[main/:na]
Caused by: java.lang.IllegalArgumentException: argument type mismatch
    at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:70) ~[na:na]
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na]
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483) ~[na:na]
    at org.bson.codecs.record.RecordCodec.decode(RecordCodec.java:136) ~[bson-record-codec-4.6.0.jar:na]
    at org.bson.codecs.record.RecordCodec.decode(RecordCodec.java:48) ~[bson-record-codec-4.6.0.jar:na]
    at com.mongodb.internal.operation.CommandResultArrayCodec.decode(CommandResultArrayCodec.java:52) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:60) ~[mongodb-driver-core-4.6.0.jar:na]
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:87) ~[bson-4.6.0.jar:na]
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:42) ~[bson-4.6.0.jar:na]
    at org.bson.internal.LazyCodec.decode(LazyCodec.java:48) ~[bson-4.6.0.jar:na]
    at org.bson.codecs.BsonDocumentCodec.readValue(BsonDocumentCodec.java:104) ~[bson-4.6.0.jar:na]
    at com.mongodb.internal.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:63) ~[mongodb-driver-core-4.6.0.jar:na]
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:87) ~[bson-4.6.0.jar:na]
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:42) ~[bson-4.6.0.jar:na]
    at com.mongodb.internal.connection.ReplyMessage.<init>(ReplyMessage.java:51) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.getCommandResult(InternalStreamConnection.java:535) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:420) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:337) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:116) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:644) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:71) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:240) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:226) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:126) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:116) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.connection.DefaultServer$OperationCountTrackingConnection.command(DefaultServer.java:345) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.operation.CommandOperationHelper.createReadCommandAndExecute(CommandOperationHelper.java:232) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.operation.FindOperation.lambda$execute$1(FindOperation.java:695) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.operation.OperationHelper.lambda$withSourceAndConnection$2(OperationHelper.java:575) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.operation.OperationHelper.withSuppliedResource(OperationHelper.java:600) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.operation.OperationHelper.lambda$withSourceAndConnection$3(OperationHelper.java:574) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.operation.OperationHelper.withSuppliedResource(OperationHelper.java:600) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.operation.OperationHelper.withSourceAndConnection(OperationHelper.java:573) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.operation.FindOperation.lambda$execute$2(FindOperation.java:690) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.async.function.RetryingSyncSupplier.get(RetryingSyncSupplier.java:65) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.operation.FindOperation.execute(FindOperation.java:722) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.internal.operation.FindOperation.execute(FindOperation.java:86) ~[mongodb-driver-core-4.6.0.jar:na]
    at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:191) ~[mongodb-driver-sync-4.6.0.jar:na]
    at com.mongodb.client.internal.MongoIterableImpl.execute(MongoIterableImpl.java:135) ~[mongodb-driver-sync-4.6.0.jar:na]
    at com.mongodb.client.internal.MongoIterableImpl.iterator(MongoIterableImpl.java:92) ~[mongodb-driver-sync-4.6.0.jar:na]
    at com.mongodb.client.internal.MongoIterableImpl.iterator(MongoIterableImpl.java:39) ~[mongodb-driver-sync-4.6.0.jar:na]
    at java.base/java.lang.Iterable.spliterator(Iterable.java:101) ~[na:na]
    at com.github.bottomlessarchive.loa.document.service.entity.factory.DocumentEntityFactory.getDocumentEntity(DocumentEntityFactory.java:57) ~[main/:na]
    at com.github.bottomlessarchive.loa.indexer.command.IndexerCommand.run(IndexerCommand.java:33) ~[main/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:777) ~[spring-boot-2.6.7.jar:2.6.7]
    ... 5 common frames omitted
Caused by: java.lang.ClassCastException: Cannot cast java.util.ArrayList to java.util.Set
    at java.base/java.lang.Class.cast(Class.java:3921) ~[na:na]
    at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67) ~[na:na]
    ... 49 common frames omitted

 

I'm in the process of migrating the existing code to use records. The previously used codec (PojoCodec by default?) supported this functionality.

How to Reproduce

  • Have a record with a variable that has Set as its type.
  • Insert a record into the database.
  • Try to read the inserted record back in the application.


 Comments   
Comment by Jeffrey Yemin [ 08/Oct/22 ]

Closing as a duplicate of JAVA-4742, which proposes a more comprehensive fix for this.

Comment by Gyula Lakatos [ 18/May/22 ]

Thanks for the info. Yes, I ran into this exact issue and had to do the steps specified in the ticket. I almost created an issue mentioning that org.bson.codecs.pojo.annotations.BsonId is not working with records. Luckily the pojo part in the package name gave away the reason why it was not working, but it was quite misleading nevertheless.

Comment by Jeffrey Yemin [ 18/May/22 ]

You might be interested in JAVA-4622, which I discovered while researching this issue.

Comment by Jeffrey Yemin [ 18/May/22 ]

I can reproduce this. We will have to look into it further, but for now as a workaround you might have to change the type from Set to List.

Generated at Thu Feb 08 09:02:32 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.