From c1036b220465102667cc230a6879408f0822361f Mon Sep 17 00:00:00 2001 From: Vedran Pavic Date: Fri, 4 Mar 2016 12:28:11 +0100 Subject: [PATCH] DATACMNS-822 - Provide customizers for default pageable and sort resolvers. Introduced dedicated callback interfaces to customize the HandlerMethodArgumentResolver instances registered by SpringDataWebConfiguration. This allows bean definition registration of those customizer interfaces instead of having to extend a configuration class. Original pull request: #208. --- ...ateoasAwareSpringDataWebConfiguration.java | 12 +++- ...ndlerMethodArgumentResolverCustomizer.java | 35 +++++++++++ ...ndlerMethodArgumentResolverCustomizer.java | 35 +++++++++++ .../config/SpringDataWebConfiguration.java | 29 ++++++++- ...eSpringDataWebSupportIntegrationTests.java | 60 +++++++++++++++++++ 5 files changed, 166 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/springframework/data/web/config/PageableHandlerMethodArgumentResolverCustomizer.java create mode 100644 src/main/java/org/springframework/data/web/config/SortHandlerMethodArgumentResolverCustomizer.java diff --git a/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java b/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java index ef9351a30..dcb2755f9 100644 --- a/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2013 the original author or authors. + * Copyright 2013-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import org.springframework.web.method.support.HandlerMethodArgumentResolver; * @author Oliver Gierke * @author Nick Williams * @author Ben Hale + * @author Vedran Pavic */ @Configuration public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfiguration { @@ -56,7 +57,10 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu @Bean @Override public HateoasPageableHandlerMethodArgumentResolver pageableResolver() { - return new HateoasPageableHandlerMethodArgumentResolver(sortResolver()); + HateoasPageableHandlerMethodArgumentResolver pageableResolver = + new HateoasPageableHandlerMethodArgumentResolver(sortResolver()); + customizePageableResolver(pageableResolver); + return pageableResolver; } /* @@ -66,7 +70,9 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu @Bean @Override public HateoasSortHandlerMethodArgumentResolver sortResolver() { - return new HateoasSortHandlerMethodArgumentResolver(); + HateoasSortHandlerMethodArgumentResolver sortResolver = new HateoasSortHandlerMethodArgumentResolver(); + customizeSortResolver(sortResolver); + return sortResolver; } @Bean diff --git a/src/main/java/org/springframework/data/web/config/PageableHandlerMethodArgumentResolverCustomizer.java b/src/main/java/org/springframework/data/web/config/PageableHandlerMethodArgumentResolverCustomizer.java new file mode 100644 index 000000000..6b8220e9c --- /dev/null +++ b/src/main/java/org/springframework/data/web/config/PageableHandlerMethodArgumentResolverCustomizer.java @@ -0,0 +1,35 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.web.config; + +import org.springframework.data.web.PageableHandlerMethodArgumentResolver; + +/** + * Callback interface that can be implemented by beans wishing to customize the + * {@link PageableHandlerMethodArgumentResolver} configuration. + * + * @author Vedran Pavic + */ +public interface PageableHandlerMethodArgumentResolverCustomizer { + + /** + * Customize the pageable resolver + * + * @param pageableResolver the {@link PageableHandlerMethodArgumentResolver} to customize + */ + void customize(PageableHandlerMethodArgumentResolver pageableResolver); + +} diff --git a/src/main/java/org/springframework/data/web/config/SortHandlerMethodArgumentResolverCustomizer.java b/src/main/java/org/springframework/data/web/config/SortHandlerMethodArgumentResolverCustomizer.java new file mode 100644 index 000000000..67bf79985 --- /dev/null +++ b/src/main/java/org/springframework/data/web/config/SortHandlerMethodArgumentResolverCustomizer.java @@ -0,0 +1,35 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.web.config; + +import org.springframework.data.web.SortHandlerMethodArgumentResolver; + +/** + * Callback interface that can be implemented by beans wishing to customize the + * {@link SortHandlerMethodArgumentResolver} configuration. + * + * @author Vedran Pavic + */ +public interface SortHandlerMethodArgumentResolverCustomizer { + + /** + * Customize the sort resolver + * + * @param sortResolver the {@link SortHandlerMethodArgumentResolver} to customize + */ + void customize(SortHandlerMethodArgumentResolver sortResolver); + +} diff --git a/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java b/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java index 93e6190dc..c45be1100 100644 --- a/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java @@ -46,6 +46,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; * * @since 1.6 * @author Oliver Gierke + * @author Vedran Pavic * @author Jens Schauder */ @Configuration @@ -61,13 +62,22 @@ public class SpringDataWebConfiguration extends WebMvcConfigurerAdapter { this.conversionService = conversionService; } + @Autowired(required = false) + private PageableHandlerMethodArgumentResolverCustomizer pageableResolverCustomizer; + + @Autowired(required = false) + private SortHandlerMethodArgumentResolverCustomizer sortResolverCustomizer; + /* * (non-Javadoc) * @see org.springframework.data.web.config.SpringDataWebConfiguration#pageableResolver() */ @Bean public PageableHandlerMethodArgumentResolver pageableResolver() { - return new PageableHandlerMethodArgumentResolver(sortResolver()); + PageableHandlerMethodArgumentResolver pageableResolver = + new PageableHandlerMethodArgumentResolver(sortResolver()); + customizePageableResolver(pageableResolver); + return pageableResolver; } /* @@ -76,7 +86,9 @@ public class SpringDataWebConfiguration extends WebMvcConfigurerAdapter { */ @Bean public SortHandlerMethodArgumentResolver sortResolver() { - return new SortHandlerMethodArgumentResolver(); + SortHandlerMethodArgumentResolver sortResolver = new SortHandlerMethodArgumentResolver(); + customizeSortResolver(sortResolver); + return sortResolver; } /* @@ -139,4 +151,17 @@ public class SpringDataWebConfiguration extends WebMvcConfigurerAdapter { converters.add(0, new XmlBeamHttpMessageConverter()); } } + + protected void customizePageableResolver(PageableHandlerMethodArgumentResolver pageableResolver) { + if (this.pageableResolverCustomizer != null) { + this.pageableResolverCustomizer.customize(pageableResolver); + } + } + + protected void customizeSortResolver(SortHandlerMethodArgumentResolver sortResolver) { + if (this.sortResolverCustomizer != null) { + this.sortResolverCustomizer.customize(sortResolver); + } + } + } diff --git a/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java b/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java index 80bb2075a..690600e5e 100755 --- a/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java +++ b/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java @@ -35,6 +35,7 @@ import org.springframework.data.web.PagedResourcesAssemblerArgumentResolver; import org.springframework.data.web.SortHandlerMethodArgumentResolver; import org.springframework.data.web.WebTestUtils; import org.springframework.hateoas.Link; +import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; @@ -50,6 +51,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; * * @author Oliver Gierke * @author Jens Schauder + * @author Vedran Pavic */ public class EnableSpringDataWebSupportIntegrationTests { @@ -63,6 +65,44 @@ public class EnableSpringDataWebSupportIntegrationTests { } } + @Configuration + @EnableWebMvc + @EnableSpringDataWebSupport + static class PageableResolverCustomizerConfig extends SampleConfig { + + @Bean + public PageableHandlerMethodArgumentResolverCustomizer testPageableResolverCustomizer() { + return new PageableHandlerMethodArgumentResolverCustomizer() { + + @Override + public void customize(PageableHandlerMethodArgumentResolver pageableResolver) { + pageableResolver.setMaxPageSize(100); + } + + }; + } + + } + + @Configuration + @EnableWebMvc + @EnableSpringDataWebSupport + static class SortResolverCustomizerConfig extends SampleConfig { + + @Bean + public SortHandlerMethodArgumentResolverCustomizer testSortResolverCustomizer() { + return new SortHandlerMethodArgumentResolverCustomizer() { + + @Override + public void customize(SortHandlerMethodArgumentResolver sortResolver) { + sortResolver.setSortParameter("foo"); + } + + }; + } + + } + @Test // DATACMNS-330 public void registersBasicBeanDefinitions() throws Exception { @@ -159,6 +199,26 @@ public class EnableSpringDataWebSupportIntegrationTests { assertThat(names).contains("sampleBean"); } + @Test // DATACMNS-822 + public void picksUpPageableResolverCustomizer() { + ApplicationContext context = WebTestUtils.createApplicationContext(PageableResolverCustomizerConfig.class); + List names = Arrays.asList(context.getBeanDefinitionNames()); + PageableHandlerMethodArgumentResolver resolver = context.getBean(PageableHandlerMethodArgumentResolver.class); + + assertThat(names, hasItem("testPageableResolverCustomizer")); + assertThat((Integer) ReflectionTestUtils.getField(resolver, "maxPageSize"), equalTo(100)); + } + + @Test // DATACMNS-822 + public void picksUpSortResolverCustomizer() { + ApplicationContext context = WebTestUtils.createApplicationContext(SortResolverCustomizerConfig.class); + List names = Arrays.asList(context.getBeanDefinitionNames()); + SortHandlerMethodArgumentResolver resolver = context.getBean(SortHandlerMethodArgumentResolver.class); + + assertThat(names, hasItem("testSortResolverCustomizer")); + assertThat((String) ReflectionTestUtils.getField(resolver, "sortParameter"), equalTo("foo")); + } + private static void assertResolversRegistered(ApplicationContext context, Class... resolverTypes) { RequestMappingHandlerAdapter adapter = context.getBean(RequestMappingHandlerAdapter.class);