From 3585d2045363c5b9f5fb6fa120a1ff9ffd500f01 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 1 Feb 2021 15:01:59 +0000 Subject: [PATCH] Include IDialect beans in WebFluxTest and WebMvcTest Fixes gh-24149 --- .../build.gradle | 1 + .../reactive/WebFluxTypeExcludeFilter.java | 19 ++++++++++++------- .../web/servlet/WebMvcTypeExcludeFilter.java | 14 ++++---------- .../WebFluxTypeExcludeFilterTests.java | 17 ++++++++++++++++- .../servlet/WebMvcTypeExcludeFilterTests.java | 17 ++++++++++++++++- 5 files changed, 49 insertions(+), 19 deletions(-) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/build.gradle b/spring-boot-project/spring-boot-test-autoconfigure/build.gradle index fc36c29e4cb0..3a0055d44810 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/build.gradle +++ b/spring-boot-project/spring-boot-test-autoconfigure/build.gradle @@ -78,6 +78,7 @@ dependencies { testImplementation("org.testcontainers:mongodb") testImplementation("org.testcontainers:neo4j") testImplementation("org.testcontainers:testcontainers") + testImplementation("org.thymeleaf:thymeleaf") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebFluxTypeExcludeFilter.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebFluxTypeExcludeFilter.java index a7d3dd0b9a7c..2a34559041a1 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebFluxTypeExcludeFilter.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebFluxTypeExcludeFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 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. @@ -21,14 +21,13 @@ import java.util.LinkedHashSet; import java.util.Set; -import com.fasterxml.jackson.databind.Module; - import org.springframework.boot.context.TypeExcludeFilter; import org.springframework.boot.jackson.JsonComponent; import org.springframework.boot.test.autoconfigure.filter.StandardAnnotationCustomizableTypeExcludeFilter; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.GenericConverter; import org.springframework.stereotype.Controller; +import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.reactive.config.WebFluxConfigurer; @@ -45,6 +44,9 @@ public final class WebFluxTypeExcludeFilter extends StandardAnnotationCustomizab private static final Class[] NO_CONTROLLERS = {}; + private static final String[] OPTIONAL_INCLUDES = { "com.fasterxml.jackson.databind.Module", + "org.thymeleaf.dialect.IDialect" }; + private static final Set> DEFAULT_INCLUDES; static { @@ -56,10 +58,13 @@ public final class WebFluxTypeExcludeFilter extends StandardAnnotationCustomizab includes.add(GenericConverter.class); includes.add(WebExceptionHandler.class); includes.add(WebFilter.class); - try { - includes.add(Module.class); - } - catch (Throwable ex) { + for (String optionalInclude : OPTIONAL_INCLUDES) { + try { + includes.add(ClassUtils.forName(optionalInclude, null)); + } + catch (Exception ex) { + // Ignore + } } DEFAULT_INCLUDES = Collections.unmodifiableSet(includes); } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTypeExcludeFilter.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTypeExcludeFilter.java index 508ca409ae9d..ffbf37e7455a 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTypeExcludeFilter.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTypeExcludeFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 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. @@ -21,8 +21,6 @@ import java.util.LinkedHashSet; import java.util.Set; -import com.fasterxml.jackson.databind.Module; - import org.springframework.boot.context.TypeExcludeFilter; import org.springframework.boot.jackson.JsonComponent; import org.springframework.boot.test.autoconfigure.filter.StandardAnnotationCustomizableTypeExcludeFilter; @@ -51,8 +49,9 @@ public final class WebMvcTypeExcludeFilter extends StandardAnnotationCustomizabl private static final Class[] NO_CONTROLLERS = {}; - private static final String[] OPTIONAL_INCLUDES = { - "org.springframework.security.config.annotation.web.WebSecurityConfigurer" }; + private static final String[] OPTIONAL_INCLUDES = { "com.fasterxml.jackson.databind.Module", + "org.springframework.security.config.annotation.web.WebSecurityConfigurer", + "org.thymeleaf.dialect.IDialect" }; private static final Set> DEFAULT_INCLUDES; @@ -70,11 +69,6 @@ public final class WebMvcTypeExcludeFilter extends StandardAnnotationCustomizabl includes.add(Converter.class); includes.add(GenericConverter.class); includes.add(HandlerInterceptor.class); - try { - includes.add(Module.class); - } - catch (Throwable ex) { - } for (String optionalInclude : OPTIONAL_INCLUDES) { try { includes.add(ClassUtils.forName(optionalInclude, null)); diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/reactive/WebFluxTypeExcludeFilterTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/reactive/WebFluxTypeExcludeFilterTests.java index a8ce35b10194..6eff59b9fb2d 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/reactive/WebFluxTypeExcludeFilterTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/reactive/WebFluxTypeExcludeFilterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 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. @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import org.junit.jupiter.api.Test; +import org.thymeleaf.dialect.IDialect; import reactor.core.publisher.Mono; import org.springframework.context.annotation.ComponentScan.Filter; @@ -59,6 +60,7 @@ void matchWhenHasNoControllers() throws Exception { assertThat(excludes(filter, ExampleRepository.class)).isTrue(); assertThat(excludes(filter, ExampleWebFilter.class)).isFalse(); assertThat(excludes(filter, ExampleModule.class)).isFalse(); + assertThat(excludes(filter, ExampleDialect.class)).isFalse(); } @Test @@ -72,6 +74,7 @@ void matchWhenHasController() throws Exception { assertThat(excludes(filter, ExampleRepository.class)).isTrue(); assertThat(excludes(filter, ExampleWebFilter.class)).isFalse(); assertThat(excludes(filter, ExampleModule.class)).isFalse(); + assertThat(excludes(filter, ExampleDialect.class)).isFalse(); } @Test @@ -85,6 +88,7 @@ void matchNotUsingDefaultFilters() throws Exception { assertThat(excludes(filter, ExampleRepository.class)).isTrue(); assertThat(excludes(filter, ExampleWebFilter.class)).isTrue(); assertThat(excludes(filter, ExampleModule.class)).isTrue(); + assertThat(excludes(filter, ExampleDialect.class)).isTrue(); } @Test @@ -98,6 +102,7 @@ void matchWithIncludeFilter() throws Exception { assertThat(excludes(filter, ExampleRepository.class)).isFalse(); assertThat(excludes(filter, ExampleWebFilter.class)).isFalse(); assertThat(excludes(filter, ExampleModule.class)).isFalse(); + assertThat(excludes(filter, ExampleDialect.class)).isFalse(); } @Test @@ -111,6 +116,7 @@ void matchWithExcludeFilter() throws Exception { assertThat(excludes(filter, ExampleRepository.class)).isTrue(); assertThat(excludes(filter, ExampleWebFilter.class)).isFalse(); assertThat(excludes(filter, ExampleModule.class)).isFalse(); + assertThat(excludes(filter, ExampleDialect.class)).isFalse(); } private boolean excludes(WebFluxTypeExcludeFilter filter, Class type) throws IOException { @@ -185,4 +191,13 @@ static class ExampleModule extends SimpleModule { } + static class ExampleDialect implements IDialect { + + @Override + public String getName() { + return "example"; + } + + } + } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTypeExcludeFilterTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTypeExcludeFilterTests.java index 79b430b93fa2..0e29e353c9a4 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTypeExcludeFilterTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTypeExcludeFilterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 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. @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import org.junit.jupiter.api.Test; +import org.thymeleaf.dialect.IDialect; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.FilterType; @@ -59,6 +60,7 @@ void matchWhenHasNoControllers() throws Exception { assertThat(excludes(filter, ExampleWebSecurityConfigurer.class)).isFalse(); assertThat(excludes(filter, ExampleHandlerInterceptor.class)).isFalse(); assertThat(excludes(filter, ExampleModule.class)).isFalse(); + assertThat(excludes(filter, ExampleDialect.class)).isFalse(); } @Test @@ -74,6 +76,7 @@ void matchWhenHasController() throws Exception { assertThat(excludes(filter, ExampleWebSecurityConfigurer.class)).isFalse(); assertThat(excludes(filter, ExampleHandlerInterceptor.class)).isFalse(); assertThat(excludes(filter, ExampleModule.class)).isFalse(); + assertThat(excludes(filter, ExampleDialect.class)).isFalse(); } @Test @@ -89,6 +92,7 @@ void matchNotUsingDefaultFilters() throws Exception { assertThat(excludes(filter, ExampleWebSecurityConfigurer.class)).isTrue(); assertThat(excludes(filter, ExampleHandlerInterceptor.class)).isTrue(); assertThat(excludes(filter, ExampleModule.class)).isTrue(); + assertThat(excludes(filter, ExampleDialect.class)).isTrue(); } @Test @@ -103,6 +107,7 @@ void matchWithIncludeFilter() throws Exception { assertThat(excludes(filter, ExampleRepository.class)).isFalse(); assertThat(excludes(filter, ExampleHandlerInterceptor.class)).isFalse(); assertThat(excludes(filter, ExampleModule.class)).isFalse(); + assertThat(excludes(filter, ExampleDialect.class)).isFalse(); } @Test @@ -118,6 +123,7 @@ void matchWithExcludeFilter() throws Exception { assertThat(excludes(filter, ExampleWebSecurityConfigurer.class)).isFalse(); assertThat(excludes(filter, ExampleHandlerInterceptor.class)).isFalse(); assertThat(excludes(filter, ExampleModule.class)).isFalse(); + assertThat(excludes(filter, ExampleDialect.class)).isFalse(); } private boolean excludes(WebMvcTypeExcludeFilter filter, Class type) throws IOException { @@ -195,4 +201,13 @@ static class ExampleModule extends SimpleModule { } + static class ExampleDialect implements IDialect { + + @Override + public String getName() { + return "example"; + } + + } + }