diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java index 39e72f6fec5f..82fc1f653856 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java @@ -264,6 +264,8 @@ public ThymeleafReactiveViewResolver thymeleafViewResolver( resolver.setResponseMaxChunkSizeBytes( this.properties.getReactive().getMaxChunkSize()); } + resolver.setFullModeViewNames(this.properties.getReactive().getFullModeViewNames()); + resolver.setChunkedModeViewNames(this.properties.getReactive().getChunkedModeViewNames()); // This resolver acts as a fallback resolver (e.g. like a // InternalResourceViewResolver) so it needs to have low precedence resolver.setOrder(Ordered.LOWEST_PRECEDENCE - 5); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafProperties.java index e403f505b6a9..b0942b69b415 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafProperties.java @@ -84,12 +84,12 @@ public class ThymeleafProperties { private Integer templateResolverOrder; /** - * Comma-separated list of view names that can be resolved. + * Comma-separated list of view names (patterns allowed) that can be resolved. */ private String[] viewNames; /** - * Comma-separated list of view names that should be excluded from resolution. + * Comma-separated list of view names (patterns allowed) that should be excluded from resolution. */ private String[] excludedViewNames; @@ -218,7 +218,8 @@ public void setContentType(MimeType contentType) { public static class Reactive { /** - * Maximum size of data buffers used for writing to the response, in bytes. + * Maximum size of data buffers used for writing to the response, in bytes. Templates will + * execute in CHUNKED mode by default if this is set a value. */ private int maxChunkSize; @@ -227,6 +228,19 @@ public static class Reactive { */ private List mediaTypes; + /** + * Comma-separated list of view names (patterns allowed) that should be executed in FULL mode + * even if a max chunk size is set. + */ + private String[] fullModeViewNames; + + /** + * Comma-separated list of view names (patterns allowed) that should be the only ones executed + * in CHUNKED mode when a max chunk size is set. + */ + private String[] chunkedModeViewNames; + + public List getMediaTypes() { return this.mediaTypes; } @@ -243,6 +257,22 @@ public void setMaxChunkSize(int maxChunkSize) { this.maxChunkSize = maxChunkSize; } + public String[] getFullModeViewNames() { + return this.fullModeViewNames; + } + + public void setFullModeViewNames(String[] fullModeViewNames) { + this.fullModeViewNames = fullModeViewNames; + } + + public String[] getChunkedModeViewNames() { + return this.chunkedModeViewNames; + } + + public void setChunkedModeViewNames(String[] chunkedModeViewNames) { + this.chunkedModeViewNames = chunkedModeViewNames; + } + } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafReactiveAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafReactiveAutoConfigurationTests.java index 7ebe9d4dcd0a..aae0eb35f2d4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafReactiveAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafReactiveAutoConfigurationTests.java @@ -112,6 +112,30 @@ public void overrideViewNames() throws Exception { assertThat(views.getViewNames()).isEqualTo(new String[] { "foo", "bar" }); } + @Test + public void overrideMaxChunkSize() throws Exception { + load(BaseConfiguration.class, "spring.thymeleaf.reactive.maxChunkSize:8192"); + ThymeleafReactiveViewResolver views = this.context + .getBean(ThymeleafReactiveViewResolver.class); + assertThat(views.getResponseMaxChunkSizeBytes()).isEqualTo(Integer.valueOf(8192)); + } + + @Test + public void overrideFullModeViewNames() throws Exception { + load(BaseConfiguration.class, "spring.thymeleaf.reactive.fullModeViewNames:foo,bar"); + ThymeleafReactiveViewResolver views = this.context + .getBean(ThymeleafReactiveViewResolver.class); + assertThat(views.getFullModeViewNames()).isEqualTo(new String[] { "foo", "bar" }); + } + + @Test + public void overrideChunkedModeViewNames() throws Exception { + load(BaseConfiguration.class, "spring.thymeleaf.reactive.chunkedModeViewNames:foo,bar"); + ThymeleafReactiveViewResolver views = this.context + .getBean(ThymeleafReactiveViewResolver.class); + assertThat(views.getChunkedModeViewNames()).isEqualTo(new String[] { "foo", "bar" }); + } + @Test public void templateLocationDoesNotExist() throws Exception { load(BaseConfiguration.class,