diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveRepositoriesAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveRepositoriesAutoConfiguration.java index 73675ec9cd..d75d44a4c8 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveRepositoriesAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveRepositoriesAutoConfiguration.java @@ -39,7 +39,7 @@ import org.springframework.data.cassandra.repository.support.ReactiveCassandraRe */ @Configuration @ConditionalOnClass({ ReactiveSession.class, ReactiveCassandraRepository.class }) -@ConditionalOnProperty(prefix = "spring.data.cassandra.reactive-repositories", name = "enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnProperty(prefix = "spring.data.cassandra.reactiverepositories", name = "enabled", havingValue = "true", matchIfMissing = true) @ConditionalOnMissingBean(ReactiveCassandraRepositoryFactoryBean.class) @Import(CassandraReactiveRepositoriesAutoConfigureRegistrar.class) @AutoConfigureAfter(CassandraReactiveDataAutoConfiguration.class) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseReactiveRepositoriesAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseReactiveRepositoriesAutoConfiguration.java index c594691885..b45f604830 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseReactiveRepositoriesAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseReactiveRepositoriesAutoConfiguration.java @@ -39,7 +39,7 @@ import org.springframework.data.couchbase.repository.support.ReactiveCouchbaseRe */ @Configuration @ConditionalOnClass({ Bucket.class, ReactiveCouchbaseRepository.class }) -@ConditionalOnProperty(prefix = "spring.data.couchbase.reactive-repositories", name = "enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnProperty(prefix = "spring.data.couchbase.reactiverepositories", name = "enabled", havingValue = "true", matchIfMissing = true) @ConditionalOnBean(ReactiveRepositoryOperationsMapping.class) @ConditionalOnMissingBean(ReactiveCouchbaseRepositoryFactoryBean.class) @Import(CouchbaseReactiveRepositoriesAutoConfigureRegistrar.class) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveRepositoriesAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveRepositoriesAutoConfiguration.java index 38c9433b94..51206fa7a6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveRepositoriesAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveRepositoriesAutoConfiguration.java @@ -51,7 +51,7 @@ import org.springframework.data.mongodb.repository.support.ReactiveMongoReposito @ConditionalOnClass({ MongoClient.class, ReactiveMongoRepository.class }) @ConditionalOnMissingBean({ ReactiveMongoRepositoryFactoryBean.class, ReactiveMongoRepositoryConfigurationExtension.class }) -@ConditionalOnProperty(prefix = "spring.data.mongodb.reactive-repositories", name = "enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnProperty(prefix = "spring.data.mongodb.reactiverepositories", name = "enabled", havingValue = "true", matchIfMissing = true) @Import(MongoReactiveRepositoriesAutoConfigureRegistrar.class) @AutoConfigureAfter(MongoReactiveDataAutoConfiguration.class) public class MongoReactiveRepositoriesAutoConfiguration { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ResourceProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ResourceProperties.java index 5554865073..e6aecd595c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ResourceProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ResourceProperties.java @@ -48,20 +48,6 @@ public class ResourceProperties { */ private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS; - /** - * Cache period for the resources served by the resource handler. If a duration suffix - * is not specified, seconds will be used. Can be overridden by the 'cache-control' - * property. - */ - @DefaultDurationUnit(ChronoUnit.SECONDS) - private Duration cachePeriod; - - /** - * Cache control HTTP headers, only allows valid directive combinations. Overrides the - * 'cache-period' property. - */ - private CacheControlProperties cacheControl = new CacheControlProperties(); - /** * Whether to enable default resource handling. */ @@ -69,6 +55,8 @@ public class ResourceProperties { private final Chain chain = new Chain(); + private final Cache cache = new Cache(); + public String[] getStaticLocations() { return this.staticLocations; } @@ -86,22 +74,6 @@ public class ResourceProperties { return normalized; } - public Duration getCachePeriod() { - return this.cachePeriod; - } - - public void setCachePeriod(Duration cachePeriod) { - this.cachePeriod = cachePeriod; - } - - public CacheControlProperties getCacheControl() { - return this.cacheControl; - } - - public void setCacheControl(CacheControlProperties cacheControl) { - this.cacheControl = cacheControl; - } - public boolean isAddMappings() { return this.addMappings; } @@ -114,6 +86,10 @@ public class ResourceProperties { return this.chain; } + public Cache getCache() { + return this.cache; + } + /** * Configuration for the Spring Resource Handling chain. */ @@ -292,204 +268,240 @@ public class ResourceProperties { } /** - * Configuration for the Cache Control HTTP header. + * Cache configuration. */ - public static class CacheControlProperties { + public static class Cache { /** - * Maximum time the response should be cached, in seconds if no duration suffix is - * not specified. + * Cache period for the resources served by the resource handler. If a duration + * suffix is not specified, seconds will be used. Can be overridden by the + * 'spring.resources.cache.control' properties. */ @DefaultDurationUnit(ChronoUnit.SECONDS) - private Duration maxAge; - - /** - * Indicate that the cached response can be reused only if re-validated with the - * server. - */ - private Boolean noCache; - - /** - * Indicate to not cache the response in any case. - */ - private Boolean noStore; + private Duration period; /** - * Indicate that once it has become stale, a cache must not use the response - * without re-validating it with the server. + * Cache control HTTP headers, only allows valid directive combinations. Overrides + * the 'spring.resources.cache.period' property. */ - private Boolean mustRevalidate; - - /** - * Indicate intermediaries (caches and others) that they should not transform the - * response content. - */ - private Boolean noTransform; - - /** - * Indicate that any cache may store the response. - */ - private Boolean cachePublic; - - /** - * Indicate that the response message is intended for a single user and must not - * be stored by a shared cache. - */ - private Boolean cachePrivate; - - /** - * Same meaning as the "must-revalidate" directive, except that it does not apply - * to private caches. - */ - private Boolean proxyRevalidate; - - /** - * Maximum time the response can be served after it becomes stale, in seconds if - * no duration suffix is not specified. - */ - @DefaultDurationUnit(ChronoUnit.SECONDS) - private Duration staleWhileRevalidate; - - /** - * Maximum time the response may be used when errors are encountered, in seconds - * if no duration suffix is not specified. - */ - @DefaultDurationUnit(ChronoUnit.SECONDS) - private Duration staleIfError; - - /** - * Maximum time the response should be cached by shared caches, in seconds if no - * duration suffix is not specified. - */ - @DefaultDurationUnit(ChronoUnit.SECONDS) - private Duration sMaxAge; + private final Control control = new Control(); - public Duration getMaxAge() { - return this.maxAge; + public Duration getPeriod() { + return this.period; } - public void setMaxAge(Duration maxAge) { - this.maxAge = maxAge; + public void setPeriod(Duration period) { + this.period = period; } - public Boolean getNoCache() { - return this.noCache; + public Control getControl() { + return this.control; } - public void setNoCache(Boolean noCache) { - this.noCache = noCache; - } - - public Boolean getNoStore() { - return this.noStore; - } + /** + * Cache Control HTTP header configuration. + */ + public static class Control { + + /** + * Maximum time the response should be cached, in seconds if no duration + * suffix is not specified. + */ + @DefaultDurationUnit(ChronoUnit.SECONDS) + private Duration maxAge; + + /** + * Indicate that the cached response can be reused only if re-validated with + * the server. + */ + private Boolean noCache; + + /** + * Indicate to not cache the response in any case. + */ + private Boolean noStore; + + /** + * Indicate that once it has become stale, a cache must not use the response + * without re-validating it with the server. + */ + private Boolean mustRevalidate; + + /** + * Indicate intermediaries (caches and others) that they should not transform + * the response content. + */ + private Boolean noTransform; + + /** + * Indicate that any cache may store the response. + */ + private Boolean cachePublic; + + /** + * Indicate that the response message is intended for a single user and must + * not be stored by a shared cache. + */ + private Boolean cachePrivate; + + /** + * Same meaning as the "must-revalidate" directive, except that it does not + * apply to private caches. + */ + private Boolean proxyRevalidate; + + /** + * Maximum time the response can be served after it becomes stale, in seconds + * if no duration suffix is not specified. + */ + @DefaultDurationUnit(ChronoUnit.SECONDS) + private Duration staleWhileRevalidate; + + /** + * Maximum time the response may be used when errors are encountered, in + * seconds if no duration suffix is not specified. + */ + @DefaultDurationUnit(ChronoUnit.SECONDS) + private Duration staleIfError; + + /** + * Maximum time the response should be cached by shared caches, in seconds if + * no duration suffix is not specified. + */ + @DefaultDurationUnit(ChronoUnit.SECONDS) + private Duration sMaxAge; + + public Duration getMaxAge() { + return this.maxAge; + } - public void setNoStore(Boolean noStore) { - this.noStore = noStore; - } + public void setMaxAge(Duration maxAge) { + this.maxAge = maxAge; + } - public Boolean getMustRevalidate() { - return this.mustRevalidate; - } + public Boolean getNoCache() { + return this.noCache; + } - public void setMustRevalidate(Boolean mustRevalidate) { - this.mustRevalidate = mustRevalidate; - } + public void setNoCache(Boolean noCache) { + this.noCache = noCache; + } - public Boolean getNoTransform() { - return this.noTransform; - } + public Boolean getNoStore() { + return this.noStore; + } - public void setNoTransform(Boolean noTransform) { - this.noTransform = noTransform; - } + public void setNoStore(Boolean noStore) { + this.noStore = noStore; + } - public Boolean getCachePublic() { - return this.cachePublic; - } + public Boolean getMustRevalidate() { + return this.mustRevalidate; + } - public void setCachePublic(Boolean cachePublic) { - this.cachePublic = cachePublic; - } + public void setMustRevalidate(Boolean mustRevalidate) { + this.mustRevalidate = mustRevalidate; + } - public Boolean getCachePrivate() { - return this.cachePrivate; - } + public Boolean getNoTransform() { + return this.noTransform; + } - public void setCachePrivate(Boolean cachePrivate) { - this.cachePrivate = cachePrivate; - } + public void setNoTransform(Boolean noTransform) { + this.noTransform = noTransform; + } - public Boolean getProxyRevalidate() { - return this.proxyRevalidate; - } + public Boolean getCachePublic() { + return this.cachePublic; + } - public void setProxyRevalidate(Boolean proxyRevalidate) { - this.proxyRevalidate = proxyRevalidate; - } + public void setCachePublic(Boolean cachePublic) { + this.cachePublic = cachePublic; + } - public Duration getStaleWhileRevalidate() { - return this.staleWhileRevalidate; - } + public Boolean getCachePrivate() { + return this.cachePrivate; + } - public void setStaleWhileRevalidate(Duration staleWhileRevalidate) { - this.staleWhileRevalidate = staleWhileRevalidate; - } + public void setCachePrivate(Boolean cachePrivate) { + this.cachePrivate = cachePrivate; + } - public Duration getStaleIfError() { - return this.staleIfError; - } + public Boolean getProxyRevalidate() { + return this.proxyRevalidate; + } - public void setStaleIfError(Duration staleIfError) { - this.staleIfError = staleIfError; - } + public void setProxyRevalidate(Boolean proxyRevalidate) { + this.proxyRevalidate = proxyRevalidate; + } - public Duration getSMaxAge() { - return this.sMaxAge; - } + public Duration getStaleWhileRevalidate() { + return this.staleWhileRevalidate; + } - public void setSMaxAge(Duration sMaxAge) { - this.sMaxAge = sMaxAge; - } + public void setStaleWhileRevalidate(Duration staleWhileRevalidate) { + this.staleWhileRevalidate = staleWhileRevalidate; + } - public CacheControl toHttpCacheControl() { - CacheControl cacheControl = createCacheControl(); - callIfTrue(this.mustRevalidate, cacheControl, CacheControl::mustRevalidate); - callIfTrue(this.noTransform, cacheControl, CacheControl::noTransform); - callIfTrue(this.cachePublic, cacheControl, CacheControl::cachePublic); - callIfTrue(this.cachePrivate, cacheControl, CacheControl::cachePrivate); - callIfTrue(this.proxyRevalidate, cacheControl, CacheControl::proxyRevalidate); - if (this.staleWhileRevalidate != null) { - cacheControl.staleWhileRevalidate(this.staleWhileRevalidate.getSeconds(), - TimeUnit.SECONDS); + public Duration getStaleIfError() { + return this.staleIfError; } - if (this.staleIfError != null) { - cacheControl.staleIfError(this.staleIfError.getSeconds(), - TimeUnit.SECONDS); + + public void setStaleIfError(Duration staleIfError) { + this.staleIfError = staleIfError; } - if (this.sMaxAge != null) { - cacheControl.sMaxAge(this.sMaxAge.getSeconds(), TimeUnit.SECONDS); + + public Duration getSMaxAge() { + return this.sMaxAge; } - return cacheControl; - } - private CacheControl createCacheControl() { - if (Boolean.TRUE.equals(this.noStore)) { - return CacheControl.noStore(); + public void setSMaxAge(Duration sMaxAge) { + this.sMaxAge = sMaxAge; } - if (Boolean.TRUE.equals(this.noCache)) { - return CacheControl.noCache(); + + public CacheControl toHttpCacheControl() { + CacheControl cacheControl = createCacheControl(); + callIfTrue(this.mustRevalidate, cacheControl, + CacheControl::mustRevalidate); + callIfTrue(this.noTransform, cacheControl, CacheControl::noTransform); + callIfTrue(this.cachePublic, cacheControl, CacheControl::cachePublic); + callIfTrue(this.cachePrivate, cacheControl, CacheControl::cachePrivate); + callIfTrue(this.proxyRevalidate, cacheControl, + CacheControl::proxyRevalidate); + if (this.staleWhileRevalidate != null) { + cacheControl.staleWhileRevalidate( + this.staleWhileRevalidate.getSeconds(), TimeUnit.SECONDS); + } + if (this.staleIfError != null) { + cacheControl.staleIfError(this.staleIfError.getSeconds(), + TimeUnit.SECONDS); + } + if (this.sMaxAge != null) { + cacheControl.sMaxAge(this.sMaxAge.getSeconds(), TimeUnit.SECONDS); + } + return cacheControl; } - if (this.maxAge != null) { - return CacheControl.maxAge(this.maxAge.getSeconds(), TimeUnit.SECONDS); + + private CacheControl createCacheControl() { + if (Boolean.TRUE.equals(this.noStore)) { + return CacheControl.noStore(); + } + if (Boolean.TRUE.equals(this.noCache)) { + return CacheControl.noCache(); + } + if (this.maxAge != null) { + return CacheControl.maxAge(this.maxAge.getSeconds(), + TimeUnit.SECONDS); + } + return CacheControl.empty(); } - return CacheControl.empty(); - } - private void callIfTrue(Boolean property, T instance, Consumer call) { - if (Boolean.TRUE.equals(property)) { - call.accept(instance); + private void callIfTrue(Boolean property, T instance, Consumer call) { + if (Boolean.TRUE.equals(property)) { + call.accept(instance); + } } + } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java index 9478363637..8a8b4e97e1 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java @@ -146,7 +146,7 @@ public class WebFluxAutoConfiguration { logger.debug("Default resource handling disabled"); return; } - Duration cachePeriod = this.resourceProperties.getCachePeriod(); + Duration cachePeriod = this.resourceProperties.getCache().getPeriod(); if (!registry.hasMappingForPattern("/webjars/**")) { ResourceHandlerRegistration registration = registry .addResourceHandler("/webjars/**") diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java index 6dd2ea43d9..b03ae3c900 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java @@ -306,8 +306,8 @@ public class WebMvcAutoConfiguration { logger.debug("Default resource handling disabled"); return; } - Duration cachePeriod = this.resourceProperties.getCachePeriod(); - CacheControl cacheControl = this.resourceProperties.getCacheControl() + Duration cachePeriod = this.resourceProperties.getCache().getPeriod(); + CacheControl cacheControl = this.resourceProperties.getCache().getControl() .toHttpCacheControl(); if (!registry.hasMappingForPattern("/webjars/**")) { customizeResourceHandlerRegistration( diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index c22d2b8fc0..9fd30d4969 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -94,7 +94,7 @@ "defaultValue": "none" }, { - "name": "spring.data.cassandra.reactive-repositories.enabled", + "name": "spring.data.cassandra.reactiverepositories.enabled", "type": "java.lang.Boolean", "description": "Whether to enable Cassandra reactive repositories.", "defaultValue": true @@ -110,7 +110,7 @@ "defaultValue": "read-your-own-writes" }, { - "name": "spring.data.couchbase.reactive-repositories.enabled", + "name": "spring.data.couchbase.reactiverepositories.enabled", "type": "java.lang.Boolean", "description": "Whether to enable Couchbase reactive repositories.", "defaultValue": true @@ -140,7 +140,7 @@ "defaultValue": true }, { - "name": "spring.data.mongodb.reactive-repositories.enabled", + "name": "spring.data.mongodb.reactiverepositories.enabled", "type": "java.lang.Boolean", "description": "Whether to enable Mongo reactive repositories.", "defaultValue": true @@ -1197,6 +1197,15 @@ "level": "error" } }, + { + "name": "spring.resources.cach-period", + "type": "java.lang.Integer", + "description": "Cache period for the resources served by the resource handler. If a duration suffix is not specified, seconds will be used.", + "deprecation": { + "replacement": "spring.resources.cach-period", + "level": "error" + } + }, { "name": "spring.sendgrid.password", "type": "java.lang.String", diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseReactiveRepositoriesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseReactiveRepositoriesAutoConfigurationTests.java index 1e2d4fe769..e32fd3aaea 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseReactiveRepositoriesAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseReactiveRepositoriesAutoConfigurationTests.java @@ -67,7 +67,7 @@ public class CouchbaseReactiveRepositoriesAutoConfigurationTests { @Test public void disableReactiveRepository() { load(DefaultConfiguration.class, - "spring.data.couchbase.reactive-repositories.enabled=false", + "spring.data.couchbase.reactiverepositories.enabled=false", "spring.data.couchbase.repositories.enabled=false"); assertThat(this.context.getBeansOfType(ReactiveCityRepository.class)).hasSize(0); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ResourcePropertiesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ResourcePropertiesTests.java index 9caa7fef7c..85b6aeee61 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ResourcePropertiesTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ResourcePropertiesTests.java @@ -22,7 +22,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.springframework.boot.autoconfigure.web.ResourceProperties.CacheControlProperties; +import org.springframework.boot.autoconfigure.web.ResourceProperties.Cache; import org.springframework.boot.testsupport.assertj.Matched; import org.springframework.http.CacheControl; @@ -79,28 +79,24 @@ public class ResourcePropertiesTests { @Test public void emptyCacheControl() { - CacheControlProperties cacheControlProperties = new CacheControlProperties(); - this.properties.setCacheControl(cacheControlProperties); - CacheControl cacheControl = this.properties.getCacheControl() + CacheControl cacheControl = this.properties.getCache().getControl() .toHttpCacheControl(); assertThat(cacheControl.getHeaderValue()).isNull(); } @Test public void cacheControlAllPropertiesSet() { - CacheControlProperties cacheControlProperties = new CacheControlProperties(); - cacheControlProperties.setMaxAge(Duration.ofSeconds(4)); - cacheControlProperties.setCachePrivate(true); - cacheControlProperties.setCachePublic(true); - cacheControlProperties.setMustRevalidate(true); - cacheControlProperties.setNoTransform(true); - cacheControlProperties.setProxyRevalidate(true); - cacheControlProperties.setSMaxAge(Duration.ofSeconds(5)); - cacheControlProperties.setStaleIfError(Duration.ofSeconds(6)); - cacheControlProperties.setStaleWhileRevalidate(Duration.ofSeconds(7)); - this.properties.setCacheControl(cacheControlProperties); - CacheControl cacheControl = this.properties.getCacheControl() - .toHttpCacheControl(); + Cache.Control properties = this.properties.getCache().getControl(); + properties.setMaxAge(Duration.ofSeconds(4)); + properties.setCachePrivate(true); + properties.setCachePublic(true); + properties.setMustRevalidate(true); + properties.setNoTransform(true); + properties.setProxyRevalidate(true); + properties.setSMaxAge(Duration.ofSeconds(5)); + properties.setStaleIfError(Duration.ofSeconds(6)); + properties.setStaleWhileRevalidate(Duration.ofSeconds(7)); + CacheControl cacheControl = properties.toHttpCacheControl(); assertThat(cacheControl.getHeaderValue()).isEqualTo( "max-age=4, must-revalidate, no-transform, public, private, proxy-revalidate," + " s-maxage=5, stale-if-error=6, stale-while-revalidate=7"); @@ -108,12 +104,10 @@ public class ResourcePropertiesTests { @Test public void invalidCacheControlCombination() { - CacheControlProperties cacheControlProperties = new CacheControlProperties(); - cacheControlProperties.setMaxAge(Duration.ofSeconds(4)); - cacheControlProperties.setNoStore(true); - this.properties.setCacheControl(cacheControlProperties); - CacheControl cacheControl = this.properties.getCacheControl() - .toHttpCacheControl(); + Cache.Control properties = this.properties.getCache().getControl(); + properties.setMaxAge(Duration.ofSeconds(4)); + properties.setNoStore(true); + CacheControl cacheControl = properties.toHttpCacheControl(); assertThat(cacheControl.getHeaderValue()).isEqualTo("no-store"); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java index 54eb65f712..6548ea3473 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfigurationTests.java @@ -711,7 +711,7 @@ public class WebMvcAutoConfigurationTests { @Test public void cachePeriod() throws Exception { - this.contextRunner.withPropertyValues("spring.resources.cache-period:5") + this.contextRunner.withPropertyValues("spring.resources.cache.period:5") .run((context) -> assertCachePeriod(context)); } @@ -733,8 +733,8 @@ public class WebMvcAutoConfigurationTests { @Test public void cacheControl() throws Exception { this.contextRunner - .withPropertyValues("spring.resources.cache-control.max-age:5", - "spring.resources.cache-control.proxy-revalidate:true") + .withPropertyValues("spring.resources.cache.control.max-age:5", + "spring.resources.cache.control.proxy-revalidate:true") .run((context) -> assertCacheControl(context)); } diff --git a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/env/DevToolsPropertyDefaultsPostProcessor.java b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/env/DevToolsPropertyDefaultsPostProcessor.java index 31cd442082..a8429f77ab 100755 --- a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/env/DevToolsPropertyDefaultsPostProcessor.java +++ b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/env/DevToolsPropertyDefaultsPostProcessor.java @@ -52,7 +52,7 @@ public class DevToolsPropertyDefaultsPostProcessor implements EnvironmentPostPro devToolsProperties.put("spring.mustache.cache", "false"); devToolsProperties.put("server.session.persistent", "true"); devToolsProperties.put("spring.h2.console.enabled", "true"); - devToolsProperties.put("spring.resources.cache-period", "0"); + devToolsProperties.put("spring.resources.cache.period", "0"); devToolsProperties.put("spring.resources.chain.cache", "false"); devToolsProperties.put("spring.template.provider.cache", "false"); devToolsProperties.put("spring.mvc.log-resolved-exception", "true"); diff --git a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfigurationTests.java b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfigurationTests.java index 6a8fa5d7f0..fc111d7da3 100644 --- a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfigurationTests.java @@ -121,7 +121,7 @@ public class LocalDevToolsAutoConfigurationTests { public void resourceCachePeriodIsZero() throws Exception { this.context = initializeAndRun(WebResourcesConfig.class); ResourceProperties properties = this.context.getBean(ResourceProperties.class); - assertThat(properties.getCachePeriod()).isEqualTo(Duration.ZERO); + assertThat(properties.getCache().getPeriod()).isEqualTo(Duration.ZERO); } @Test diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index cd35f5bde2..cffdd2a7c4 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -398,18 +398,18 @@ content into your application. Rather, pick only the properties that you need. # SPRING RESOURCES HANDLING ({sc-spring-boot-autoconfigure}/web/ResourceProperties.{sc-ext}[ResourceProperties]) spring.resources.add-mappings=true # Whether to enable default resource handling. - spring.resources.cache-control.max-age= # Maximum time the response should be cached, in seconds if no duration suffix is not specified. - spring.resources.cache-control.no-cache= # Indicate that the cached response can be reused only if re-validated with the server. - spring.resources.cache-control.no-store= # Indicate to not cache the response in any case. - spring.resources.cache-control.must-revalidate= # Indicate that once it has become stale, a cache must not use the response without re-validating it with the server. - spring.resources.cache-control.no-transform= # Indicate intermediaries (caches and others) that they should not transform the response content. - spring.resources.cache-control.cache-public= # Indicate that any cache may store the response. - spring.resources.cache-control.cache-private= # Indicate that the response message is intended for a single user and must not be stored by a shared cache. - spring.resources.cache-control.proxy-revalidate= # Same meaning as the "must-revalidate" directive, except that it does not apply to private caches. - spring.resources.cache-control.stale-while-revalidate= # Maximum time the response can be served after it becomes stale, in seconds if no duration suffix is not specified. - spring.resources.cache-control.stale-if-error= # Maximum time the response may be used when errors are encountered, in seconds if no duration suffix is not specified. - spring.resources.cache-control.s-max-age= # Maximum time the response should be cached by shared caches, in seconds if no duration suffix is not specified. - spring.resources.cache-period= # Cache period for the resources served by the resource handler. If a duration suffix is not specified, seconds will be used. + spring.resources.cache.control.max-age= # Maximum time the response should be cached, in seconds if no duration suffix is not specified. + spring.resources.cache.control.no-cache= # Indicate that the cached response can be reused only if re-validated with the server. + spring.resources.cache.control.no-store= # Indicate to not cache the response in any case. + spring.resources.cache.control.must-revalidate= # Indicate that once it has become stale, a cache must not use the response without re-validating it with the server. + spring.resources.cache.control.no-transform= # Indicate intermediaries (caches and others) that they should not transform the response content. + spring.resources.cache.control.cache-public= # Indicate that any cache may store the response. + spring.resources.cache.control.cache-private= # Indicate that the response message is intended for a single user and must not be stored by a shared cache. + spring.resources.cache.control.proxy-revalidate= # Same meaning as the "must-revalidate" directive, except that it does not apply to private caches. + spring.resources.cache.control.stale-while-revalidate= # Maximum time the response can be served after it becomes stale, in seconds if no duration suffix is not specified. + spring.resources.cache.control.stale-if-error= # Maximum time the response may be used when errors are encountered, in seconds if no duration suffix is not specified. + spring.resources.cache.control.s-max-age= # Maximum time the response should be cached by shared caches, in seconds if no duration suffix is not specified. + spring.resources.cache.period= # Cache period for the resources served by the resource handler. If a duration suffix is not specified, seconds will be used. spring.resources.chain.cache=true # Whether to enable caching in the Resource chain. spring.resources.chain.enabled= # Whether to enable the Spring Resource Handling chain. By default, disabled unless at least one strategy has been enabled. spring.resources.chain.gzipped=false # Whether to enable resolution of already gzipped resources. @@ -588,7 +588,7 @@ content into your application. Rather, pick only the properties that you need. spring.data.cassandra.pool.idle-timeout=120 # Idle timeout before an idle connection is removed. If a duration suffix is not specified, seconds will be used. spring.data.cassandra.pool.max-queue-size=256 # Maximum number of requests that get queued if no connection is available. spring.data.cassandra.pool.pool-timeout=5000ms # Pool timeout when trying to acquire a connection from a host's pool. - spring.data.cassandra.reactive-repositories.enabled=true # Whether to enable Cassandra reactive repositories. + spring.data.cassandra.reactiverepositories.enabled=true # Whether to enable Cassandra reactive repositories. spring.data.cassandra.read-timeout= # Socket option: read time out. spring.data.cassandra.reconnection-policy= # Reconnection policy class. spring.data.cassandra.repositories.enabled= # Enable Cassandra repositories. @@ -601,7 +601,7 @@ content into your application. Rather, pick only the properties that you need. # DATA COUCHBASE ({sc-spring-boot-autoconfigure}/data/couchbase/CouchbaseDataProperties.{sc-ext}[CouchbaseDataProperties]) spring.data.couchbase.auto-index=false # Automatically create views and indexes. spring.data.couchbase.consistency=read-your-own-writes # Consistency to apply by default on generated queries. - spring.data.couchbase.reactive-repositories.enabled=true # Enable Couchbase reactive repositories. + spring.data.couchbase.reactiverepositories.enabled=true # Enable Couchbase reactive repositories. spring.data.couchbase.repositories.enabled=true # Enable Couchbase repositories. # ELASTICSEARCH ({sc-spring-boot-autoconfigure}/data/elasticsearch/ElasticsearchProperties.{sc-ext}[ElasticsearchProperties]) @@ -621,7 +621,7 @@ content into your application. Rather, pick only the properties that you need. spring.data.mongodb.host=localhost # Mongo server host. Cannot be set with URI. spring.data.mongodb.password= # Login password of the mongo server. Cannot be set with URI. spring.data.mongodb.port=27017 # Mongo server port. Cannot be set with URI. - spring.data.mongodb.reactive-repositories.enabled=true # Whether to enable Mongo reactive repositories. + spring.data.mongodb.reactiverepositories.enabled=true # Whether to enable Mongo reactive repositories. spring.data.mongodb.repositories.enabled=true # Whether to enable Mongo repositories. spring.data.mongodb.uri=mongodb://localhost/test # Mongo database URI. Cannot be set with host, port and credentials. spring.data.mongodb.username= # Login user of the mongo server. Cannot be set with URI.