diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/web/SpringDataWebAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/web/SpringDataWebAutoConfigurationTests.java index 0c7d83848f..ef71f35ca5 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/web/SpringDataWebAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/web/SpringDataWebAutoConfigurationTests.java @@ -16,19 +16,14 @@ package org.springframework.boot.autoconfigure.data.web; -import java.util.Map; - -import org.junit.After; import org.junit.Test; -import org.springframework.boot.test.util.TestPropertyValues; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.data.domain.PageRequest; import org.springframework.data.web.PageableHandlerMethodArgumentResolver; import org.springframework.data.web.SortHandlerMethodArgumentResolver; -import org.springframework.mock.web.MockServletContext; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import static org.assertj.core.api.Assertions.assertThat; @@ -41,104 +36,88 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class SpringDataWebAutoConfigurationTests { - private AnnotationConfigWebApplicationContext context; - - @After - public void after() { - if (this.context != null) { - this.context.close(); - } - } + private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner() + .withConfiguration( + AutoConfigurations.of(SpringDataWebAutoConfiguration.class)); @Test public void webSupportIsAutoConfiguredInWebApplicationContexts() { - load(); - this.context.setServletContext(new MockServletContext()); - Map beans = this.context - .getBeansOfType(PageableHandlerMethodArgumentResolver.class); - assertThat(beans).hasSize(1); + this.contextRunner.run((context) -> assertThat(context) + .hasSingleBean(PageableHandlerMethodArgumentResolver.class)); } @Test public void autoConfigurationBacksOffInNonWebApplicationContexts() { - AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); - ctx.register(SpringDataWebAutoConfiguration.class); - try { - ctx.refresh(); - Map beans = ctx - .getBeansOfType(PageableHandlerMethodArgumentResolver.class); - assertThat(beans).isEmpty(); - } - finally { - ctx.close(); - } + new ApplicationContextRunner() + .withConfiguration( + AutoConfigurations.of(SpringDataWebAutoConfiguration.class)) + .run((context) -> assertThat(context) + .doesNotHaveBean(PageableHandlerMethodArgumentResolver.class)); } @Test public void customizePageable() { - load("spring.data.web.pageable.page-parameter=p", - "spring.data.web.pageable.size-parameter=s", - "spring.data.web.pageable.default-page-size=10", - "spring.data.web.pageable.prefix=abc", - "spring.data.web.pageable.qualifier-delimiter=__", - "spring.data.web.pageable.max-page-size=100", - "spring.data.web.pageable.one-indexed-parameters=true"); - PageableHandlerMethodArgumentResolver argumentResolver = this.context - .getBean(PageableHandlerMethodArgumentResolver.class); - assertThat(ReflectionTestUtils.getField(argumentResolver, "pageParameterName")) - .isEqualTo("p"); - assertThat(ReflectionTestUtils.getField(argumentResolver, "sizeParameterName")) - .isEqualTo("s"); - assertThat(ReflectionTestUtils.getField(argumentResolver, "oneIndexedParameters")) - .isEqualTo(true); - assertThat(ReflectionTestUtils.getField(argumentResolver, "prefix")) - .isEqualTo("abc"); - assertThat(ReflectionTestUtils.getField(argumentResolver, "qualifierDelimiter")) - .isEqualTo("__"); - assertThat(ReflectionTestUtils.getField(argumentResolver, "fallbackPageable")) - .isEqualTo(PageRequest.of(0, 10)); - assertThat(ReflectionTestUtils.getField(argumentResolver, "maxPageSize")) - .isEqualTo(100); + this.contextRunner + .withPropertyValues("spring.data.web.pageable.page-parameter=p", + "spring.data.web.pageable.size-parameter=s", + "spring.data.web.pageable.default-page-size=10", + "spring.data.web.pageable.prefix=abc", + "spring.data.web.pageable.qualifier-delimiter=__", + "spring.data.web.pageable.max-page-size=100", + "spring.data.web.pageable.one-indexed-parameters=true") + .run((context) -> { + PageableHandlerMethodArgumentResolver argumentResolver = context + .getBean(PageableHandlerMethodArgumentResolver.class); + assertThat(argumentResolver) + .hasFieldOrPropertyWithValue("pageParameterName", "p"); + assertThat(argumentResolver) + .hasFieldOrPropertyWithValue("sizeParameterName", "s"); + assertThat(argumentResolver) + .hasFieldOrPropertyWithValue("oneIndexedParameters", true); + assertThat(argumentResolver).hasFieldOrPropertyWithValue("prefix", + "abc"); + assertThat(argumentResolver) + .hasFieldOrPropertyWithValue("qualifierDelimiter", "__"); + assertThat(argumentResolver).hasFieldOrPropertyWithValue( + "fallbackPageable", PageRequest.of(0, 10)); + assertThat(argumentResolver) + .hasFieldOrPropertyWithValue("maxPageSize", 100); + }); } @Test public void defaultPageable() { - load(); - PageableHandlerMethodArgumentResolver argumentResolver = this.context - .getBean(PageableHandlerMethodArgumentResolver.class); - SpringDataWebProperties.Pageable properties = new SpringDataWebProperties() - .getPageable(); - assertThat(ReflectionTestUtils.getField(argumentResolver, "pageParameterName")) - .isEqualTo(properties.getPageParameter()); - assertThat(ReflectionTestUtils.getField(argumentResolver, "sizeParameterName")) - .isEqualTo(properties.getSizeParameter()); - assertThat(ReflectionTestUtils.getField(argumentResolver, "oneIndexedParameters")) - .isEqualTo(properties.isOneIndexedParameters()); - assertThat(ReflectionTestUtils.getField(argumentResolver, "prefix")) - .isEqualTo(properties.getPrefix()); - assertThat(ReflectionTestUtils.getField(argumentResolver, "qualifierDelimiter")) - .isEqualTo(properties.getQualifierDelimiter()); - assertThat(ReflectionTestUtils.getField(argumentResolver, "fallbackPageable")) - .isEqualTo(PageRequest.of(0, properties.getDefaultPageSize())); - assertThat(ReflectionTestUtils.getField(argumentResolver, "maxPageSize")) - .isEqualTo(properties.getMaxPageSize()); + this.contextRunner.run((context) -> { + SpringDataWebProperties.Pageable properties = new SpringDataWebProperties() + .getPageable(); + PageableHandlerMethodArgumentResolver argumentResolver = context + .getBean(PageableHandlerMethodArgumentResolver.class); + assertThat(argumentResolver).hasFieldOrPropertyWithValue("pageParameterName", + properties.getPageParameter()); + assertThat(argumentResolver).hasFieldOrPropertyWithValue("sizeParameterName", + properties.getSizeParameter()); + assertThat(argumentResolver).hasFieldOrPropertyWithValue( + "oneIndexedParameters", properties.isOneIndexedParameters()); + assertThat(argumentResolver).hasFieldOrPropertyWithValue("prefix", + properties.getPrefix()); + assertThat(argumentResolver).hasFieldOrPropertyWithValue("qualifierDelimiter", + properties.getQualifierDelimiter()); + assertThat(argumentResolver).hasFieldOrPropertyWithValue("fallbackPageable", + PageRequest.of(0, properties.getDefaultPageSize())); + assertThat(argumentResolver).hasFieldOrPropertyWithValue("maxPageSize", + properties.getMaxPageSize()); + }); } @Test public void customizeSort() { - load("spring.data.web.sort.sort-parameter=s"); - SortHandlerMethodArgumentResolver argumentResolver = this.context - .getBean(SortHandlerMethodArgumentResolver.class); - assertThat(ReflectionTestUtils.getField(argumentResolver, "sortParameter")) - .isEqualTo("s"); - } - - private void load(String... environment) { - AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); - TestPropertyValues.of(environment).applyTo(ctx); - ctx.register(SpringDataWebAutoConfiguration.class); - ctx.refresh(); - this.context = ctx; + this.contextRunner.withPropertyValues("spring.data.web.sort.sort-parameter=s") + .run((context) -> { + SortHandlerMethodArgumentResolver argumentResolver = context + .getBean(SortHandlerMethodArgumentResolver.class); + assertThat(argumentResolver) + .hasFieldOrPropertyWithValue("sortParameter", "s"); + }); } } diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/howto.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/howto.adoc index 5b306ded72..4f004e149a 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/howto.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/howto.adoc @@ -2140,6 +2140,14 @@ the annotations and flags accordingly. +[[howto-use-customize-spring-datas-web-support]] +=== Customize Spring Data's Web Support +Spring Data provides web support that simplifies the use of Spring Data repositories in a +web application. Spring Boot provides properties in the `spring.data.web` namespace +for customizing its configuration. Note that if you are using Spring Data REST, you must +use the properties in the `spring.data.rest` namespace instead. + + [[howto-use-exposing-spring-data-repositories-rest-endpoint]] === Expose Spring Data Repositories as REST Endpoint Spring Data REST can expose the `Repository` implementations as REST endpoints for you,