Forward StringValueResolver to DelegatingHandlerMappings targets.

RepositoryRestMvcConfiguration now implements EmbeddedValueResolver to forward the StringValueResolver given to both BasePathAwareHandlerMapping and RepositoryRestHandlerMapping.

Related ticket: #2087.
This commit is contained in:
Oliver Drotbohm
2022-07-13 23:42:53 +02:00
parent 86ff61cc10
commit f89a458bc7
2 changed files with 35 additions and 1 deletions

View File

@@ -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<HateoasSortHandlerMethodArgumentResolver> 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<HandlerMapping> mappings = new ArrayList<>();

View File

@@ -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<HandlerMapping> 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",