diff --git a/src/main/java/org/springframework/data/keyvalue/core/mapping/BasicKeyValuePersistentEntity.java b/src/main/java/org/springframework/data/keyvalue/core/mapping/BasicKeyValuePersistentEntity.java index 8e5702b..e198452 100644 --- a/src/main/java/org/springframework/data/keyvalue/core/mapping/BasicKeyValuePersistentEntity.java +++ b/src/main/java/org/springframework/data/keyvalue/core/mapping/BasicKeyValuePersistentEntity.java @@ -25,7 +25,7 @@ import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** - * {@link KeyValuePersistentEntity} implementation that adds specific meta-data such as the {@literal keySpace}.. + * {@link KeyValuePersistentEntity} implementation that adds specific meta-data such as the {@literal keySpace}. * * @author Christoph Strobl * @author Oliver Gierke @@ -37,31 +37,47 @@ public class BasicKeyValuePersistentEntity information, - @Nullable KeySpaceResolver fallbackKeySpaceResolver) { + public BasicKeyValuePersistentEntity(TypeInformation information) { + this(information, (String) null); + } + + /** + * @param information must not be {@literal null}. + * @param keySpaceResolver can be {@literal null}. + */ + public BasicKeyValuePersistentEntity(TypeInformation information, @Nullable KeySpaceResolver keySpaceResolver) { + this(information, keySpaceResolver != null ? keySpaceResolver.resolveKeySpace(information.getType()) : null); + } + + private BasicKeyValuePersistentEntity(TypeInformation information, @Nullable String keyspace) { super(information); - Class type = information.getType(); - String keySpace = AnnotationBasedKeySpaceResolver.INSTANCE.resolveKeySpace(type); + if (StringUtils.hasText(keyspace)) { - if (StringUtils.hasText(keySpace)) { - - this.keyspace = keySpace; - this.keyspaceExpression = detectExpression(keySpace); + this.keyspace = keyspace; + this.keyspaceExpression = null; } else { - this.keyspace = resolveKeyspace(fallbackKeySpaceResolver, type); - this.keyspaceExpression = null; + Class type = information.getType(); + String detectedKeyspace = AnnotationBasedKeySpaceResolver.INSTANCE.resolveKeySpace(type); + + if (StringUtils.hasText(detectedKeyspace)) { + + this.keyspace = detectedKeyspace; + this.keyspaceExpression = detectExpression(detectedKeyspace); + } else { + + this.keyspace = ClassNameKeySpaceResolver.INSTANCE.resolveKeySpace(type); + this.keyspaceExpression = null; + } } } @@ -79,12 +95,6 @@ public class BasicKeyValuePersistentEntity type) { - return (fallbackKeySpaceResolver == null ? DEFAULT_FALLBACK_RESOLVER : fallbackKeySpaceResolver) - .resolveKeySpace(type); - } - @Override public String getKeySpace() { return keyspaceExpression == null // diff --git a/src/main/java/org/springframework/data/keyvalue/core/mapping/ClassNameKeySpaceResolver.java b/src/main/java/org/springframework/data/keyvalue/core/mapping/ClassNameKeySpaceResolver.java index f329778..465013b 100644 --- a/src/main/java/org/springframework/data/keyvalue/core/mapping/ClassNameKeySpaceResolver.java +++ b/src/main/java/org/springframework/data/keyvalue/core/mapping/ClassNameKeySpaceResolver.java @@ -24,7 +24,7 @@ import org.springframework.util.ClassUtils; * @author Christoph Strobl * @author Oliver Gierke */ -enum ClassNameKeySpaceResolver implements KeySpaceResolver { +public enum ClassNameKeySpaceResolver implements KeySpaceResolver { INSTANCE; diff --git a/src/main/java/org/springframework/data/keyvalue/core/mapping/KeySpaceResolver.java b/src/main/java/org/springframework/data/keyvalue/core/mapping/KeySpaceResolver.java index 4cd1d07..757f9f6 100644 --- a/src/main/java/org/springframework/data/keyvalue/core/mapping/KeySpaceResolver.java +++ b/src/main/java/org/springframework/data/keyvalue/core/mapping/KeySpaceResolver.java @@ -19,7 +19,7 @@ import org.springframework.lang.Nullable; /** * {@link KeySpaceResolver} determines the {@literal keyspace} a given type is assigned to. A keyspace in this context - * is a specific region/collection/grouping of elements sharing a common keyrange.
+ * is a specific region/collection/grouping of elements sharing a common keyrange. * * @author Christoph Strobl * @author Mark Paluch diff --git a/src/main/java/org/springframework/data/keyvalue/core/mapping/PrefixKeyspaceResolver.java b/src/main/java/org/springframework/data/keyvalue/core/mapping/PrefixKeyspaceResolver.java index c784e5b..cd15685 100644 --- a/src/main/java/org/springframework/data/keyvalue/core/mapping/PrefixKeyspaceResolver.java +++ b/src/main/java/org/springframework/data/keyvalue/core/mapping/PrefixKeyspaceResolver.java @@ -22,7 +22,7 @@ import org.springframework.util.Assert; * delegate {@link KeySpaceResolver}. * * @author Mark Paluch - * @since 3.0 + * @since 3.1 */ public class PrefixKeyspaceResolver implements KeySpaceResolver { diff --git a/src/main/java/org/springframework/data/keyvalue/core/mapping/context/KeyValueMappingContext.java b/src/main/java/org/springframework/data/keyvalue/core/mapping/context/KeyValueMappingContext.java index a5b4632..b78d5f9 100644 --- a/src/main/java/org/springframework/data/keyvalue/core/mapping/context/KeyValueMappingContext.java +++ b/src/main/java/org/springframework/data/keyvalue/core/mapping/context/KeyValueMappingContext.java @@ -39,7 +39,7 @@ import org.springframework.lang.Nullable; public class KeyValueMappingContext, P extends KeyValuePersistentProperty

> extends AbstractMappingContext { - private @Nullable KeySpaceResolver fallbackKeySpaceResolver; + private @Nullable KeySpaceResolver keySpaceResolver; public KeyValueMappingContext() { setSimpleTypeHolder(new KeyValueSimpleTypeHolder()); @@ -49,24 +49,37 @@ public class KeyValueMappingContext, P * Configures the {@link KeySpaceResolver} to be used if not explicit key space is annotated to the domain type. * * @param fallbackKeySpaceResolver can be {@literal null}. + * @deprecated since 3.1, use {@link KeySpaceResolver} instead. */ + @Deprecated(since = "3.1") public void setFallbackKeySpaceResolver(KeySpaceResolver fallbackKeySpaceResolver) { - this.fallbackKeySpaceResolver = fallbackKeySpaceResolver; + setKeySpaceResolver(fallbackKeySpaceResolver); } /** - * @return the current fallback KeySpaceResolver. Can be {@literal null}. - * @since 3.0 + * Configures the {@link KeySpaceResolver} to be used. Configuring a {@link KeySpaceResolver} disables SpEL evaluation + * abilities. + * + * @param keySpaceResolver can be {@literal null}. + * @since 3.1 + */ + public void setKeySpaceResolver(KeySpaceResolver keySpaceResolver) { + this.keySpaceResolver = keySpaceResolver; + } + + /** + * @return the current {@link KeySpaceResolver}. Can be {@literal null}. + * @since 3.1 */ @Nullable - public KeySpaceResolver getFallbackKeySpaceResolver() { - return fallbackKeySpaceResolver; + public KeySpaceResolver getKeySpaceResolver() { + return keySpaceResolver; } @Override @SuppressWarnings("unchecked") protected E createPersistentEntity(TypeInformation typeInformation) { - return (E) new BasicKeyValuePersistentEntity(typeInformation, getFallbackKeySpaceResolver()); + return (E) new BasicKeyValuePersistentEntity(typeInformation, getKeySpaceResolver()); } @Override diff --git a/src/test/java/org/springframework/data/keyvalue/core/mapping/BasicKeyValuePersistentEntityUnitTests.java b/src/test/java/org/springframework/data/keyvalue/core/mapping/BasicKeyValuePersistentEntityUnitTests.java index a0d4043..e70d77f 100644 --- a/src/test/java/org/springframework/data/keyvalue/core/mapping/BasicKeyValuePersistentEntityUnitTests.java +++ b/src/test/java/org/springframework/data/keyvalue/core/mapping/BasicKeyValuePersistentEntityUnitTests.java @@ -24,7 +24,6 @@ import java.util.Map; import org.junit.jupiter.api.Test; import org.springframework.data.keyvalue.annotation.KeySpace; import org.springframework.data.keyvalue.core.mapping.context.KeyValueMappingContext; -import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.spel.ExtensionAwareEvaluationContextProvider; import org.springframework.data.spel.spi.EvaluationContextExtension; @@ -35,7 +34,7 @@ import org.springframework.data.spel.spi.EvaluationContextExtension; */ class BasicKeyValuePersistentEntityUnitTests { - private MappingContext, ? extends KeyValuePersistentProperty> mappingContext = new KeyValueMappingContext<>(); + private KeyValueMappingContext, ? extends KeyValuePersistentProperty> mappingContext = new KeyValueMappingContext<>(); @Test // DATAKV-268 void shouldDeriveKeyspaceFromClassName() { @@ -64,6 +63,24 @@ class BasicKeyValuePersistentEntityUnitTests { assertThat(persistentEntity.getKeySpace()).isEqualTo(NoKeyspaceEntity.class.getName()); } + @Test // GH-461 + void shouldApplyKeySpaceResolver() { + + mappingContext.setKeySpaceResolver(new PrefixKeyspaceResolver("foo", ClassNameKeySpaceResolver.INSTANCE)); + KeyValuePersistentEntity persistentEntity = mappingContext.getPersistentEntity(NoKeyspaceEntity.class); + + assertThat(persistentEntity.getKeySpace()).isEqualTo("foo" + NoKeyspaceEntity.class.getName()); + } + + @Test // GH-461 + void shouldFallBackToDefaultsIfKeySpaceResolverReturnsNull() { + + mappingContext.setKeySpaceResolver(it -> null); + KeyValuePersistentEntity persistentEntity = mappingContext.getPersistentEntity(NoKeyspaceEntity.class); + + assertThat(persistentEntity.getKeySpace()).isEqualTo(NoKeyspaceEntity.class.getName()); + } + @KeySpace("#{myProperty}") private static class ExpressionEntity {}