|
|
|
|
@ -28,11 +28,14 @@ import lombok.RequiredArgsConstructor;
@@ -28,11 +28,14 @@ import lombok.RequiredArgsConstructor;
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
|
import java.math.BigInteger; |
|
|
|
|
import java.net.URL; |
|
|
|
|
import java.nio.ByteBuffer; |
|
|
|
|
import java.time.LocalDate; |
|
|
|
|
import java.time.LocalDateTime; |
|
|
|
|
import java.time.temporal.ChronoUnit; |
|
|
|
|
import java.util.*; |
|
|
|
|
|
|
|
|
|
import org.assertj.core.data.Percentage; |
|
|
|
|
import org.bson.BsonUndefined; |
|
|
|
|
import org.bson.types.Binary; |
|
|
|
|
import org.bson.types.Code; |
|
|
|
|
import org.bson.types.Decimal128; |
|
|
|
|
@ -125,7 +128,8 @@ class MappingMongoConverterUnitTests {
@@ -125,7 +128,8 @@ class MappingMongoConverterUnitTests {
|
|
|
|
|
@BeforeEach |
|
|
|
|
void beforeEach() { |
|
|
|
|
|
|
|
|
|
MongoCustomConversions conversions = new MongoCustomConversions(); |
|
|
|
|
MongoCustomConversions conversions = new MongoCustomConversions( |
|
|
|
|
Arrays.asList(new ByteBufferToDoubleHolderConverter())); |
|
|
|
|
|
|
|
|
|
mappingContext = new MongoMappingContext(); |
|
|
|
|
mappingContext.setApplicationContext(context); |
|
|
|
|
@ -2531,8 +2535,8 @@ class MappingMongoConverterUnitTests {
@@ -2531,8 +2535,8 @@ class MappingMongoConverterUnitTests {
|
|
|
|
|
converter.afterPropertiesSet(); |
|
|
|
|
|
|
|
|
|
org.bson.Document source = new org.bson.Document("typeImplementingMap", |
|
|
|
|
new org.bson.Document("1st", "one").append("2nd", 2)).append("_class", |
|
|
|
|
TypeWrappingTypeImplementingMap.class.getName()); |
|
|
|
|
new org.bson.Document("1st", "one").append("2nd", 2)) |
|
|
|
|
.append("_class", TypeWrappingTypeImplementingMap.class.getName()); |
|
|
|
|
|
|
|
|
|
TypeWrappingTypeImplementingMap target = converter.read(TypeWrappingTypeImplementingMap.class, source); |
|
|
|
|
|
|
|
|
|
@ -2720,8 +2724,8 @@ class MappingMongoConverterUnitTests {
@@ -2720,8 +2724,8 @@ class MappingMongoConverterUnitTests {
|
|
|
|
|
.and((target, underlyingType) -> !converter.conversions.isSimpleType(target)), |
|
|
|
|
mappingContext); |
|
|
|
|
|
|
|
|
|
EntityProjection<WithNestedInterfaceProjection, Person> projection = introspector.introspect(WithNestedInterfaceProjection.class, |
|
|
|
|
Person.class); |
|
|
|
|
EntityProjection<WithNestedInterfaceProjection, Person> projection = introspector |
|
|
|
|
.introspect(WithNestedInterfaceProjection.class, Person.class); |
|
|
|
|
WithNestedInterfaceProjection person = converter.project(projection, source); |
|
|
|
|
|
|
|
|
|
assertThat(person.getFirstname()).isEqualTo("spring"); |
|
|
|
|
@ -2739,14 +2743,35 @@ class MappingMongoConverterUnitTests {
@@ -2739,14 +2743,35 @@ class MappingMongoConverterUnitTests {
|
|
|
|
|
.and((target, underlyingType) -> !converter.conversions.isSimpleType(target)), |
|
|
|
|
mappingContext); |
|
|
|
|
|
|
|
|
|
EntityProjection<WithNestedDtoProjection, Person> projection = introspector.introspect(WithNestedDtoProjection.class, |
|
|
|
|
Person.class); |
|
|
|
|
EntityProjection<WithNestedDtoProjection, Person> projection = introspector |
|
|
|
|
.introspect(WithNestedDtoProjection.class, Person.class); |
|
|
|
|
WithNestedDtoProjection person = converter.project(projection, source); |
|
|
|
|
|
|
|
|
|
assertThat(person.getFirstname()).isEqualTo("spring"); |
|
|
|
|
assertThat(person.getAddress().getStreet()).isEqualTo("data"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test // GH-4626
|
|
|
|
|
void projectShouldReadDtoProjectionPropertiesOnlyOnce() { |
|
|
|
|
|
|
|
|
|
ByteBuffer number = ByteBuffer.allocate(8); |
|
|
|
|
number.putDouble(1.2d); |
|
|
|
|
number.flip(); |
|
|
|
|
|
|
|
|
|
org.bson.Document source = new org.bson.Document("number", number); |
|
|
|
|
|
|
|
|
|
EntityProjectionIntrospector introspector = EntityProjectionIntrospector.create(converter.getProjectionFactory(), |
|
|
|
|
EntityProjectionIntrospector.ProjectionPredicate.typeHierarchy() |
|
|
|
|
.and((target, underlyingType) -> !converter.conversions.isSimpleType(target)), |
|
|
|
|
mappingContext); |
|
|
|
|
|
|
|
|
|
EntityProjection<DoubleHolderDto, WithDoubleHolder> projection = introspector.introspect(DoubleHolderDto.class, |
|
|
|
|
WithDoubleHolder.class); |
|
|
|
|
DoubleHolderDto result = converter.project(projection, source); |
|
|
|
|
|
|
|
|
|
assertThat(result.number.number).isCloseTo(1.2, Percentage.withPercentage(1)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test // GH-2860
|
|
|
|
|
void projectShouldReadProjectionWithNestedEntity() { |
|
|
|
|
|
|
|
|
|
@ -3022,11 +3047,13 @@ class MappingMongoConverterUnitTests {
@@ -3022,11 +3047,13 @@ class MappingMongoConverterUnitTests {
|
|
|
|
|
|
|
|
|
|
interface WithNestedInterfaceProjection { |
|
|
|
|
String getFirstname(); |
|
|
|
|
|
|
|
|
|
AddressProjection getAddress(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
interface WithNestedDtoProjection { |
|
|
|
|
String getFirstname(); |
|
|
|
|
|
|
|
|
|
AddressDto getAddress(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -3925,4 +3952,30 @@ class MappingMongoConverterUnitTests {
@@ -3925,4 +3952,30 @@ class MappingMongoConverterUnitTests {
|
|
|
|
|
ComplexId id; |
|
|
|
|
String value; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ReadingConverter |
|
|
|
|
static class ByteBufferToDoubleHolderConverter implements Converter<ByteBuffer, DoubleHolder> { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public DoubleHolder convert(ByteBuffer source) { |
|
|
|
|
return new DoubleHolder(source.getDouble()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
record DoubleHolder(double number) { |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static class WithDoubleHolder { |
|
|
|
|
DoubleHolder number; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static class DoubleHolderDto { |
|
|
|
|
DoubleHolder number; |
|
|
|
|
|
|
|
|
|
public DoubleHolderDto(DoubleHolder number) { |
|
|
|
|
this.number = number; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|