diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java index fa2fc24ce..e43f8d6bb 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java @@ -33,6 +33,7 @@ import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; +import org.springframework.context.EmbeddedValueResolverAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -119,6 +120,7 @@ import org.springframework.http.converter.json.MappingJackson2HttpMessageConvert import org.springframework.http.server.ServerHttpRequest; import org.springframework.plugin.core.PluginRegistry; import org.springframework.util.ClassUtils; +import org.springframework.util.StringValueResolver; import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; @@ -155,7 +157,7 @@ import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; SpringDataJacksonConfiguration.class, // EnableSpringDataWebSupport.QuerydslActivator.class }) public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebConfiguration - implements BeanClassLoaderAware { + implements BeanClassLoaderAware, EmbeddedValueResolverAware { private static final boolean IS_JPA_AVAILABLE = ClassUtils.isPresent("javax.persistence.EntityManager", RepositoryRestMvcConfiguration.class.getClassLoader()); @@ -196,6 +198,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon private final Lazy sortResolver; private ClassLoader beanClassLoader; + private StringValueResolver stringValueResolver; public RepositoryRestMvcConfiguration( // ApplicationContext context, // @@ -286,6 +289,15 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon this.beanClassLoader = classLoader; } + /* + * (non-Javadoc) + * @see org.springframework.context.EmbeddedValueResolverAware#setEmbeddedValueResolver(org.springframework.util.StringValueResolver) + */ + @Override + public void setEmbeddedValueResolver(StringValueResolver resolver) { + this.stringValueResolver = resolver; + } + @Bean public Repositories repositories() { return new Repositories(applicationContext); @@ -688,12 +700,14 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon repositoryMapping.setApplicationContext(applicationContext); repositoryMapping.setCorsConfigurations(corsConfigurations); repositoryMapping.setPatternParser(parser); + repositoryMapping.setEmbeddedValueResolver(stringValueResolver); repositoryMapping.afterPropertiesSet(); BasePathAwareHandlerMapping basePathMapping = new BasePathAwareHandlerMapping(repositoryRestConfiguration); basePathMapping.setApplicationContext(applicationContext); basePathMapping.setCorsConfigurations(corsConfigurations); basePathMapping.setPatternParser(parser); + basePathMapping.setEmbeddedValueResolver(stringValueResolver); basePathMapping.afterPropertiesSet(); List mappings = new ArrayList<>(); diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java index 875676762..a0d77c482 100755 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java @@ -61,6 +61,8 @@ import org.springframework.http.converter.json.AbstractJackson2HttpMessageConver import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.util.MultiValueMap; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import org.springframework.web.util.UriComponentsBuilder; import com.fasterxml.jackson.databind.ObjectMapper; @@ -232,6 +234,24 @@ class RepositoryRestMvConfigurationIntegrationTests { assertThat(factory).isEqualTo(ExtendingConfiguration.collector); } + @Test // #2087 + void registersEmbeddedValueResolverForHandlerMappings() { + + DelegatingHandlerMapping mapping = context.getBean(DelegatingHandlerMapping.class); + + List delegates = mapping.getDelegates(); + + assertThat(delegates).hasSize(2); + assertThat(delegates).allMatch(it -> { + + if (!(it instanceof RequestMappingHandlerMapping)) { + return false; + } + + return ReflectionTestUtils.getField(it, "embeddedValueResolver") != null; + }); + } + private static ObjectMapper getObjectMapper() { AbstractJackson2HttpMessageConverter converter = context.getBean("halJacksonHttpMessageConverter",