Skip to content

Commit de7eeb5

Browse files
committed
Fix ResourceUrlEncodingFilter conditions
Fix `ResourceUrlEncodingFilter` conditions which were inadvertently changed in commits 64f04fc and 6cc272e and would back off if any `FilterRegistrationBean` was found. The updated conditions restores the behavior of Spring Boot 2.0.5 and allows users to directly register their own `ResourceUrlEncodingFilter` beans (as long as they don't use a `FilterRegistrationBean`). Fixes gh-14897
1 parent f145e81 commit de7eeb5

File tree

4 files changed

+82
-10
lines changed

4 files changed

+82
-10
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerServletWebConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public FreeMarkerViewResolver freeMarkerViewResolver() {
7474
}
7575

7676
@Bean
77-
@ConditionalOnMissingBean
77+
@ConditionalOnMissingBean(ResourceUrlEncodingFilter.class)
7878
@ConditionalOnEnabledResourceChain
7979
public FilterRegistrationBean<ResourceUrlEncodingFilter> resourceUrlEncodingFilter() {
8080
FilterRegistrationBean<ResourceUrlEncodingFilter> registration = new FilterRegistrationBean<>(

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public SpringTemplateEngine templateEngine() {
167167
static class ThymeleafWebMvcConfiguration {
168168

169169
@Bean
170-
@ConditionalOnMissingBean
170+
@ConditionalOnMissingBean(ResourceUrlEncodingFilter.class)
171171
@ConditionalOnEnabledResourceChain
172172
public FilterRegistrationBean<ResourceUrlEncodingFilter> resourceUrlEncodingFilter() {
173173
FilterRegistrationBean<ResourceUrlEncodingFilter> registration = new FilterRegistrationBean<>(

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfigurationServletIntegrationTests.java

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,22 @@
1919
import java.io.StringWriter;
2020
import java.util.EnumSet;
2121
import java.util.Locale;
22+
import java.util.Map;
2223

2324
import javax.servlet.DispatcherType;
2425
import javax.servlet.http.HttpServletRequest;
2526

2627
import org.junit.After;
27-
import org.junit.Before;
2828
import org.junit.Test;
2929

30+
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
31+
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
3032
import org.springframework.boot.test.util.TestPropertyValues;
3133
import org.springframework.boot.web.servlet.FilterRegistrationBean;
34+
import org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter;
35+
import org.springframework.context.annotation.Bean;
36+
import org.springframework.context.annotation.Configuration;
37+
import org.springframework.context.annotation.Import;
3238
import org.springframework.mock.web.MockHttpServletRequest;
3339
import org.springframework.mock.web.MockHttpServletResponse;
3440
import org.springframework.mock.web.MockServletContext;
@@ -52,12 +58,7 @@
5258
*/
5359
public class FreeMarkerAutoConfigurationServletIntegrationTests {
5460

55-
private AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
56-
57-
@Before
58-
public void setupContext() {
59-
this.context.setServletContext(new MockServletContext());
60-
}
61+
private AnnotationConfigWebApplicationContext context;
6162

6263
@After
6364
public void close() {
@@ -170,9 +171,31 @@ public void registerResourceHandlingFilterOnlyIfResourceChainIsEnabled() {
170171
EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR));
171172
}
172173

174+
@Test
175+
@SuppressWarnings("rawtypes")
176+
public void registerResourceHandlingFilterWithOtherRegistrationBean() {
177+
// gh-14897
178+
registerAndRefreshContext(FilterRegistrationConfiguration.class,
179+
"spring.resources.chain.enabled:true");
180+
Map<String, FilterRegistrationBean> beans = this.context
181+
.getBeansOfType(FilterRegistrationBean.class);
182+
assertThat(beans).hasSize(2);
183+
FilterRegistrationBean registration = beans.values().stream()
184+
.filter((r) -> r.getFilter() instanceof ResourceUrlEncodingFilter)
185+
.findFirst().get();
186+
assertThat(registration).hasFieldOrPropertyWithValue("dispatcherTypes",
187+
EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR));
188+
}
189+
173190
private void registerAndRefreshContext(String... env) {
191+
registerAndRefreshContext(BaseConfiguration.class, env);
192+
}
193+
194+
private void registerAndRefreshContext(Class<?> config, String... env) {
195+
this.context = new AnnotationConfigWebApplicationContext();
196+
this.context.setServletContext(new MockServletContext());
174197
TestPropertyValues.of(env).applyTo(this.context);
175-
this.context.register(FreeMarkerAutoConfiguration.class);
198+
this.context.register(config);
176199
this.context.refresh();
177200
}
178201

@@ -193,4 +216,23 @@ private MockHttpServletResponse render(String viewName) throws Exception {
193216
return response;
194217
}
195218

219+
@Configuration
220+
@ImportAutoConfiguration({ FreeMarkerAutoConfiguration.class,
221+
PropertyPlaceholderAutoConfiguration.class })
222+
static class BaseConfiguration {
223+
224+
}
225+
226+
@Configuration
227+
@Import(BaseConfiguration.class)
228+
static class FilterRegistrationConfiguration {
229+
230+
@Bean
231+
public FilterRegistrationBean<OrderedCharacterEncodingFilter> filterRegisration() {
232+
return new FilterRegistrationBean<OrderedCharacterEncodingFilter>(
233+
new OrderedCharacterEncodingFilter());
234+
}
235+
236+
}
237+
196238
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafServletAutoConfigurationTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Collections;
2121
import java.util.EnumSet;
2222
import java.util.Locale;
23+
import java.util.Map;
2324

2425
import javax.servlet.DispatcherType;
2526

@@ -41,6 +42,7 @@
4142
import org.springframework.boot.test.rule.OutputCapture;
4243
import org.springframework.boot.test.util.TestPropertyValues;
4344
import org.springframework.boot.web.servlet.FilterRegistrationBean;
45+
import org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter;
4446
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
4547
import org.springframework.context.annotation.Bean;
4648
import org.springframework.context.annotation.Configuration;
@@ -224,6 +226,22 @@ public void registerResourceHandlingFilterOnlyIfResourceChainIsEnabled() {
224226
EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR));
225227
}
226228

229+
@Test
230+
@SuppressWarnings("rawtypes")
231+
public void registerResourceHandlingFilterWithOtherRegistrationBean() {
232+
// gh-14897
233+
load(FilterRegistrationConfiguration.class,
234+
"spring.resources.chain.enabled:true");
235+
Map<String, FilterRegistrationBean> beans = this.context
236+
.getBeansOfType(FilterRegistrationBean.class);
237+
assertThat(beans).hasSize(2);
238+
FilterRegistrationBean registration = beans.values().stream()
239+
.filter((r) -> r.getFilter() instanceof ResourceUrlEncodingFilter)
240+
.findFirst().get();
241+
assertThat(registration).hasFieldOrPropertyWithValue("dispatcherTypes",
242+
EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR));
243+
}
244+
227245
@Test
228246
public void layoutDialectCanBeCustomized() {
229247
load(LayoutDialectConfiguration.class);
@@ -269,4 +287,16 @@ public LayoutDialect layoutDialect() {
269287

270288
}
271289

290+
@Configuration
291+
@Import(BaseConfiguration.class)
292+
static class FilterRegistrationConfiguration {
293+
294+
@Bean
295+
public FilterRegistrationBean<OrderedCharacterEncodingFilter> filterRegisration() {
296+
return new FilterRegistrationBean<OrderedCharacterEncodingFilter>(
297+
new OrderedCharacterEncodingFilter());
298+
}
299+
300+
}
301+
272302
}

0 commit comments

Comments
 (0)