Commit 2097b6a4 authored by Phillip Webb's avatar Phillip Webb

Improve ResourceUrlEncodingFilter conditions

Update Thymeleaf and FreeMarker configurations to make use of the new
`@ConditionalOnMissingFilterBean` annotation.

Closes gh-14926
parent 44a46f15
...@@ -25,6 +25,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean ...@@ -25,6 +25,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.web.ConditionalOnEnabledResourceChain; import org.springframework.boot.autoconfigure.web.ConditionalOnEnabledResourceChain;
import org.springframework.boot.autoconfigure.web.servlet.ConditionalOnMissingFilterBean;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
...@@ -74,8 +75,8 @@ class FreeMarkerServletWebConfiguration extends AbstractFreeMarkerConfiguration ...@@ -74,8 +75,8 @@ class FreeMarkerServletWebConfiguration extends AbstractFreeMarkerConfiguration
} }
@Bean @Bean
@ConditionalOnMissingBean(ResourceUrlEncodingFilter.class)
@ConditionalOnEnabledResourceChain @ConditionalOnEnabledResourceChain
@ConditionalOnMissingFilterBean(ResourceUrlEncodingFilter.class)
public FilterRegistrationBean<ResourceUrlEncodingFilter> resourceUrlEncodingFilter() { public FilterRegistrationBean<ResourceUrlEncodingFilter> resourceUrlEncodingFilter() {
FilterRegistrationBean<ResourceUrlEncodingFilter> registration = new FilterRegistrationBean<>( FilterRegistrationBean<ResourceUrlEncodingFilter> registration = new FilterRegistrationBean<>(
new ResourceUrlEncodingFilter()); new ResourceUrlEncodingFilter());
......
...@@ -50,6 +50,7 @@ import org.springframework.boot.autoconfigure.template.TemplateLocation; ...@@ -50,6 +50,7 @@ import org.springframework.boot.autoconfigure.template.TemplateLocation;
import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties.Reactive; import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties.Reactive;
import org.springframework.boot.autoconfigure.web.ConditionalOnEnabledResourceChain; import org.springframework.boot.autoconfigure.web.ConditionalOnEnabledResourceChain;
import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration; import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration;
import org.springframework.boot.autoconfigure.web.servlet.ConditionalOnMissingFilterBean;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.context.properties.PropertyMapper; import org.springframework.boot.context.properties.PropertyMapper;
...@@ -169,8 +170,8 @@ public class ThymeleafAutoConfiguration { ...@@ -169,8 +170,8 @@ public class ThymeleafAutoConfiguration {
static class ThymeleafWebMvcConfiguration { static class ThymeleafWebMvcConfiguration {
@Bean @Bean
@ConditionalOnMissingBean(ResourceUrlEncodingFilter.class)
@ConditionalOnEnabledResourceChain @ConditionalOnEnabledResourceChain
@ConditionalOnMissingFilterBean(ResourceUrlEncodingFilter.class)
public FilterRegistrationBean<ResourceUrlEncodingFilter> resourceUrlEncodingFilter() { public FilterRegistrationBean<ResourceUrlEncodingFilter> resourceUrlEncodingFilter() {
FilterRegistrationBean<ResourceUrlEncodingFilter> registration = new FilterRegistrationBean<>( FilterRegistrationBean<ResourceUrlEncodingFilter> registration = new FilterRegistrationBean<>(
new ResourceUrlEncodingFilter()); new ResourceUrlEncodingFilter());
......
...@@ -173,7 +173,7 @@ public class FreeMarkerAutoConfigurationServletIntegrationTests { ...@@ -173,7 +173,7 @@ public class FreeMarkerAutoConfigurationServletIntegrationTests {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public void registerResourceHandlingFilterWithOtherRegistrationBean() { public void registerResourceHandlingFilterWithOtherRegistrationBean() {
// gh-14897 // gh-14897
load(FilterRegistrationConfiguration.class, load(FilterRegistrationOtherConfiguration.class,
"spring.resources.chain.enabled:true"); "spring.resources.chain.enabled:true");
Map<String, FilterRegistrationBean> beans = this.context Map<String, FilterRegistrationBean> beans = this.context
.getBeansOfType(FilterRegistrationBean.class); .getBeansOfType(FilterRegistrationBean.class);
...@@ -185,6 +185,22 @@ public class FreeMarkerAutoConfigurationServletIntegrationTests { ...@@ -185,6 +185,22 @@ public class FreeMarkerAutoConfigurationServletIntegrationTests {
EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR)); EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR));
} }
@Test
@SuppressWarnings("rawtypes")
public void registerResourceHandlingFilterWithResourceRegistrationBean() {
// gh-14926
load(FilterRegistrationResourceConfiguration.class,
"spring.resources.chain.enabled:true");
Map<String, FilterRegistrationBean> beans = this.context
.getBeansOfType(FilterRegistrationBean.class);
assertThat(beans).hasSize(1);
FilterRegistrationBean registration = beans.values().stream()
.filter((r) -> r.getFilter() instanceof ResourceUrlEncodingFilter)
.findFirst().get();
assertThat(registration).hasFieldOrPropertyWithValue("dispatcherTypes",
EnumSet.of(DispatcherType.INCLUDE));
}
private void load(String... env) { private void load(String... env) {
load(BaseConfiguration.class, env); load(BaseConfiguration.class, env);
} }
...@@ -223,7 +239,21 @@ public class FreeMarkerAutoConfigurationServletIntegrationTests { ...@@ -223,7 +239,21 @@ public class FreeMarkerAutoConfigurationServletIntegrationTests {
@Configuration @Configuration
@Import(BaseConfiguration.class) @Import(BaseConfiguration.class)
static class FilterRegistrationConfiguration { static class FilterRegistrationResourceConfiguration {
@Bean
public FilterRegistrationBean<ResourceUrlEncodingFilter> filterRegisration() {
FilterRegistrationBean<ResourceUrlEncodingFilter> bean = new FilterRegistrationBean<ResourceUrlEncodingFilter>(
new ResourceUrlEncodingFilter());
bean.setDispatcherTypes(EnumSet.of(DispatcherType.INCLUDE));
return bean;
}
}
@Configuration
@Import(BaseConfiguration.class)
static class FilterRegistrationOtherConfiguration {
@Bean @Bean
public FilterRegistrationBean<OrderedCharacterEncodingFilter> filterRegisration() { public FilterRegistrationBean<OrderedCharacterEncodingFilter> filterRegisration() {
......
...@@ -281,7 +281,7 @@ public class ThymeleafServletAutoConfigurationTests { ...@@ -281,7 +281,7 @@ public class ThymeleafServletAutoConfigurationTests {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public void registerResourceHandlingFilterWithOtherRegistrationBean() { public void registerResourceHandlingFilterWithOtherRegistrationBean() {
// gh-14897 // gh-14897
load(FilterRegistrationConfiguration.class, load(FilterRegistrationOtherConfiguration.class,
"spring.resources.chain.enabled:true"); "spring.resources.chain.enabled:true");
Map<String, FilterRegistrationBean> beans = this.context Map<String, FilterRegistrationBean> beans = this.context
.getBeansOfType(FilterRegistrationBean.class); .getBeansOfType(FilterRegistrationBean.class);
...@@ -293,6 +293,22 @@ public class ThymeleafServletAutoConfigurationTests { ...@@ -293,6 +293,22 @@ public class ThymeleafServletAutoConfigurationTests {
EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR)); EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR));
} }
@Test
@SuppressWarnings("rawtypes")
public void registerResourceHandlingFilterWithResourceRegistrationBean() {
// gh-14926
load(FilterRegistrationResourceConfiguration.class,
"spring.resources.chain.enabled:true");
Map<String, FilterRegistrationBean> beans = this.context
.getBeansOfType(FilterRegistrationBean.class);
assertThat(beans).hasSize(1);
FilterRegistrationBean registration = beans.values().stream()
.filter((r) -> r.getFilter() instanceof ResourceUrlEncodingFilter)
.findFirst().get();
assertThat(registration).hasFieldOrPropertyWithValue("dispatcherTypes",
EnumSet.of(DispatcherType.INCLUDE));
}
@Test @Test
public void layoutDialectCanBeCustomized() { public void layoutDialectCanBeCustomized() {
load(LayoutDialectConfiguration.class); load(LayoutDialectConfiguration.class);
...@@ -337,7 +353,21 @@ public class ThymeleafServletAutoConfigurationTests { ...@@ -337,7 +353,21 @@ public class ThymeleafServletAutoConfigurationTests {
@Configuration @Configuration
@Import(BaseConfiguration.class) @Import(BaseConfiguration.class)
static class FilterRegistrationConfiguration { static class FilterRegistrationResourceConfiguration {
@Bean
public FilterRegistrationBean<ResourceUrlEncodingFilter> filterRegisration() {
FilterRegistrationBean<ResourceUrlEncodingFilter> bean = new FilterRegistrationBean<ResourceUrlEncodingFilter>(
new ResourceUrlEncodingFilter());
bean.setDispatcherTypes(EnumSet.of(DispatcherType.INCLUDE));
return bean;
}
}
@Configuration
@Import(BaseConfiguration.class)
static class FilterRegistrationOtherConfiguration {
@Bean @Bean
public FilterRegistrationBean<OrderedCharacterEncodingFilter> filterRegisration() { public FilterRegistrationBean<OrderedCharacterEncodingFilter> filterRegisration() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment