Skip to content

Commit

Permalink
Merge pull request #3130 from micronaut-projects/fixm
Browse files Browse the repository at this point in the history
MongoDB: Ignore basic types codecs
  • Loading branch information
dstepanov committed Sep 16, 2024
2 parents 7c1b660 + ae81d87 commit 8fbd9a9
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import io.micronaut.core.annotation.Internal;
import io.micronaut.core.beans.BeanIntrospection;
import io.micronaut.core.convert.ConversionContext;
import io.micronaut.core.reflect.ClassUtils;
import io.micronaut.core.type.Argument;
import io.micronaut.data.annotation.GeneratedValue;
import io.micronaut.data.annotation.MappedProperty;
Expand All @@ -39,7 +40,6 @@
import org.bson.BsonDocument;
import org.bson.codecs.BsonDocumentCodec;
import org.bson.codecs.Codec;
import org.bson.codecs.IterableCodec;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.types.ObjectId;

Expand Down Expand Up @@ -180,11 +180,14 @@ public <T> Deserializer<? extends T> findDeserializer(Argument<? extends T> type
if (codec instanceof MappedCodec<? extends T> mappedCodec) {
return mappedCodec.deserializer;
}
if (codec != null
&& !(codec instanceof IterableCodec)
&& !(Map.class.isAssignableFrom(codec.getEncoderClass()))
&& !(Collection.class.isAssignableFrom(codec.getEncoderClass()))) {
return new CodecBsonDecoder<>((Codec<T>) codec);
if (codec != null) {
// Eliminate codecs for basic types and collections
Class<? extends T> encoderClass = codec.getEncoderClass();
if (!ClassUtils.isJavaLangType(encoderClass)
&& !Map.class.isAssignableFrom(encoderClass)
&& !Iterable.class.isAssignableFrom(encoderClass)) {
return new CodecBsonDecoder<>((Codec<T>) codec);
}
}
return parent.findDeserializer(type);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import io.micronaut.core.annotation.Internal;
import io.micronaut.core.convert.ConversionContext;
import io.micronaut.core.convert.ConversionService;
import io.micronaut.core.reflect.ClassUtils;
import io.micronaut.core.type.Argument;
import io.micronaut.data.annotation.GeneratedValue;
import io.micronaut.data.annotation.MappedProperty;
Expand All @@ -35,7 +36,6 @@
import io.micronaut.serde.reference.PropertyReference;
import io.micronaut.serde.reference.SerializationReference;
import org.bson.codecs.Codec;
import org.bson.codecs.IterableCodec;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.types.ObjectId;

Expand Down Expand Up @@ -164,8 +164,14 @@ public <T> Serializer<? super T> findSerializer(Argument<? extends T> type) thro
if (codec instanceof MappedCodec mappedCodec) {
return mappedCodec.serializer;
}
if (codec != null && !(codec instanceof IterableCodec) && !(Map.class.isAssignableFrom(codec.getEncoderClass()))) {
return new CodecBsonDecoder<>((Codec<T>) codec);
if (codec != null) {
// Eliminate codecs for basic types and collections
Class<? extends T> encoderClass = codec.getEncoderClass();
if (!ClassUtils.isJavaLangType(encoderClass)
&& !Map.class.isAssignableFrom(encoderClass)
&& !Iterable.class.isAssignableFrom(encoderClass)) {
return new CodecBsonDecoder<>((Codec<T>) codec);
}
}
return parent.findSerializer(type);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package io.micronaut.data.document.mongodb

import groovy.transform.CompileStatic
import io.micronaut.context.ApplicationContext
import io.micronaut.core.annotation.Introspected
import io.micronaut.data.annotation.MappedEntity
import io.micronaut.data.mongodb.annotation.MongoRepository
import io.micronaut.data.repository.CrudRepository
import io.micronaut.serde.annotation.Serdeable
import io.micronaut.test.extensions.spock.annotation.MicronautTest
import jakarta.inject.Inject
import jakarta.persistence.Id
import spock.lang.AutoCleanup
import spock.lang.Shared
import spock.lang.Specification

@MicronautTest
class MongoRuntimeSpec extends Specification implements MongoTestPropertyProvider {
@AutoCleanup
@Shared
ApplicationContext applicationContext = ApplicationContext.run(getProperties())

@Shared
@Inject
TestContentRepository contentRepository = applicationContext.getBean(TestContentRepository)

def cleanup() {
contentRepository.deleteAll()
}

void 'test runtime serialization'() {
given:
TestContent testContent = new TestContent(
id: 'test',
category: [
one : 'one',
two : 2,
three: false
]
)

when:
contentRepository.save(testContent)
then:
contentRepository.findById('test').get().category == testContent.category
}

}

@CompileStatic
@MongoRepository
interface TestContentRepository extends CrudRepository<TestContent, String> {
}

@CompileStatic
@Serdeable
@MappedEntity
@Introspected
class TestContent {

@Id
String id

BigDecimal number


String propertyId = null // Property name.


Map category = null
}

0 comments on commit 8fbd9a9

Please sign in to comment.