diff --git a/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentProperty.java b/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentProperty.java index 800d38aa9..1de5687fd 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentProperty.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentProperty.java @@ -35,6 +35,7 @@ import org.springframework.data.elasticsearch.annotations.IndexedIndexName; import org.springframework.data.elasticsearch.annotations.MultiField; import org.springframework.data.elasticsearch.annotations.ValueConverter; import org.springframework.data.elasticsearch.annotations.WriteOnlyProperty; +import org.springframework.data.elasticsearch.core.convert.AbstractPropertyValueConverter; import org.springframework.data.elasticsearch.core.convert.DatePropertyValueConverter; import org.springframework.data.elasticsearch.core.convert.DateRangePropertyValueConverter; import org.springframework.data.elasticsearch.core.convert.ElasticsearchDateConverter; @@ -250,7 +251,11 @@ public class SimpleElasticsearchPersistentProperty extends } propertyValueConverter = enumConstants[0]; } else { - propertyValueConverter = BeanUtils.instantiateClass(clazz); + if (AbstractPropertyValueConverter.class.isAssignableFrom(clazz)) { + propertyValueConverter = BeanUtils.instantiateClass(BeanUtils.getResolvableConstructor(clazz), this); + } else { + propertyValueConverter = BeanUtils.instantiateClass(clazz); + } } } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentPropertyUnitTests.java b/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentPropertyUnitTests.java index dff798e0c..a4ea91486 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentPropertyUnitTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentPropertyUnitTests.java @@ -34,8 +34,10 @@ import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.data.elasticsearch.annotations.InnerField; import org.springframework.data.elasticsearch.annotations.MultiField; import org.springframework.data.elasticsearch.annotations.ValueConverter; +import org.springframework.data.elasticsearch.core.convert.AbstractPropertyValueConverter; import org.springframework.data.elasticsearch.core.query.SeqNoPrimaryTerm; import org.springframework.data.mapping.MappingException; +import org.springframework.data.mapping.PersistentProperty; import org.springframework.data.mapping.model.FieldNamingStrategy; import org.springframework.data.mapping.model.Property; import org.springframework.data.mapping.model.PropertyNameFieldNamingStrategy; @@ -258,6 +260,8 @@ public class SimpleElasticsearchPersistentPropertyUnitTests { assertThat( persistentEntity.getRequiredPersistentProperty("fieldWithClassBasedConverter").getPropertyValueConverter()) .isInstanceOf(ClassBasedValueConverter.class); + assertThat(persistentEntity.getRequiredPersistentProperty("fieldWithClassBasedDerivedFromAbstractValueConverter") + .getPropertyValueConverter()).isInstanceOf(ClassBasedDerivedFromAbstractValueConverter.class); assertThat( persistentEntity.getRequiredPersistentProperty("fieldWithEnumBasedConverter").getPropertyValueConverter()) .isInstanceOf(EnumBasedValueConverter.class); @@ -354,6 +358,8 @@ public class SimpleElasticsearchPersistentPropertyUnitTests { @Nullable @ValueConverter(ClassBasedValueConverter.class) private String fieldWithClassBasedConverter; @Nullable + @ValueConverter(ClassBasedDerivedFromAbstractValueConverter.class) private String fieldWithClassBasedDerivedFromAbstractValueConverter; + @Nullable @ValueConverter(EnumBasedValueConverter.class) private String fieldWithEnumBasedConverter; } @@ -370,6 +376,23 @@ public class SimpleElasticsearchPersistentPropertyUnitTests { } } + private static class ClassBasedDerivedFromAbstractValueConverter extends AbstractPropertyValueConverter { + + public ClassBasedDerivedFromAbstractValueConverter(PersistentProperty property) { + super(property); + } + + @Override + public Object write(Object value) { + return value; + } + + @Override + public Object read(Object value) { + return value; + } + } + private enum EnumBasedValueConverter implements PropertyValueConverter { INSTANCE; diff --git a/src/test/java/org/springframework/data/elasticsearch/repository/query/valueconverter/ValueConverterIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/repository/query/valueconverter/ValueConverterIntegrationTests.java index cbd1df6fc..01109e8d7 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repository/query/valueconverter/ValueConverterIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/repository/query/valueconverter/ValueConverterIntegrationTests.java @@ -39,7 +39,7 @@ import org.springframework.lang.Nullable; /** * Integration tests to check that {@link org.springframework.data.elasticsearch.annotations.ValueConverter} annotated - * properties are handle correctly (method name derived queries, for + * properties are handled correctly (method name derived queries, for * * @{@link org.springframework.data.elasticsearch.core.query.Query} methods we don't know which parameters map to which * property.