Browse Source

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.
pull/173/merge
Vedran Pavic 10 years ago committed by Oliver Gierke
parent
commit
c1036b2204
  1. 12
      src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java
  2. 35
      src/main/java/org/springframework/data/web/config/PageableHandlerMethodArgumentResolverCustomizer.java
  3. 35
      src/main/java/org/springframework/data/web/config/SortHandlerMethodArgumentResolverCustomizer.java
  4. 29
      src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java
  5. 60
      src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java

12
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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 Oliver Gierke
* @author Nick Williams * @author Nick Williams
* @author Ben Hale * @author Ben Hale
* @author Vedran Pavic
*/ */
@Configuration @Configuration
public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfiguration { public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfiguration {
@ -56,7 +57,10 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu
@Bean @Bean
@Override @Override
public HateoasPageableHandlerMethodArgumentResolver pageableResolver() { 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 @Bean
@Override @Override
public HateoasSortHandlerMethodArgumentResolver sortResolver() { public HateoasSortHandlerMethodArgumentResolver sortResolver() {
return new HateoasSortHandlerMethodArgumentResolver(); HateoasSortHandlerMethodArgumentResolver sortResolver = new HateoasSortHandlerMethodArgumentResolver();
customizeSortResolver(sortResolver);
return sortResolver;
} }
@Bean @Bean

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

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

29
src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java

@ -46,6 +46,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
* *
* @since 1.6 * @since 1.6
* @author Oliver Gierke * @author Oliver Gierke
* @author Vedran Pavic
* @author Jens Schauder * @author Jens Schauder
*/ */
@Configuration @Configuration
@ -61,13 +62,22 @@ public class SpringDataWebConfiguration extends WebMvcConfigurerAdapter {
this.conversionService = conversionService; this.conversionService = conversionService;
} }
@Autowired(required = false)
private PageableHandlerMethodArgumentResolverCustomizer pageableResolverCustomizer;
@Autowired(required = false)
private SortHandlerMethodArgumentResolverCustomizer sortResolverCustomizer;
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.springframework.data.web.config.SpringDataWebConfiguration#pageableResolver() * @see org.springframework.data.web.config.SpringDataWebConfiguration#pageableResolver()
*/ */
@Bean @Bean
public PageableHandlerMethodArgumentResolver pageableResolver() { 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 @Bean
public SortHandlerMethodArgumentResolver sortResolver() { 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()); 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);
}
}
} }

60
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.SortHandlerMethodArgumentResolver;
import org.springframework.data.web.WebTestUtils; import org.springframework.data.web.WebTestUtils;
import org.springframework.hateoas.Link; import org.springframework.hateoas.Link;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.WebApplicationContext;
@ -50,6 +51,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
* *
* @author Oliver Gierke * @author Oliver Gierke
* @author Jens Schauder * @author Jens Schauder
* @author Vedran Pavic
*/ */
public class EnableSpringDataWebSupportIntegrationTests { 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 @Test // DATACMNS-330
public void registersBasicBeanDefinitions() throws Exception { public void registersBasicBeanDefinitions() throws Exception {
@ -159,6 +199,26 @@ public class EnableSpringDataWebSupportIntegrationTests {
assertThat(names).contains("sampleBean"); assertThat(names).contains("sampleBean");
} }
@Test // DATACMNS-822
public void picksUpPageableResolverCustomizer() {
ApplicationContext context = WebTestUtils.createApplicationContext(PageableResolverCustomizerConfig.class);
List<String> 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<String> 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) { private static void assertResolversRegistered(ApplicationContext context, Class<?>... resolverTypes) {
RequestMappingHandlerAdapter adapter = context.getBean(RequestMappingHandlerAdapter.class); RequestMappingHandlerAdapter adapter = context.getBean(RequestMappingHandlerAdapter.class);

Loading…
Cancel
Save