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);