Skip to content

Commit 4fd2056

Browse files
committed
Add initParameters and servletRegistrationBeans
Signed-off-by: Daeho Kwon <[email protected]>
1 parent e87d5d7 commit 4fd2056

File tree

3 files changed

+72
-1
lines changed

3 files changed

+72
-1
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/FilterRegistration.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import jakarta.servlet.DispatcherType;
2626
import jakarta.servlet.Filter;
27+
import jakarta.servlet.annotation.WebInitParam;
2728

2829
import org.springframework.core.Ordered;
2930
import org.springframework.core.annotation.AliasFor;
@@ -34,6 +35,7 @@
3435
* annotation-based alternative to {@link FilterRegistrationBean}.
3536
*
3637
* @author Moritz Halbritter
38+
* @author Daeho Kwon
3739
* @since 3.5.0
3840
* @see FilterRegistrationBean
3941
*/
@@ -81,6 +83,12 @@
8183
*/
8284
boolean ignoreRegistrationFailure() default false;
8385

86+
/**
87+
* Init parameters to be used with the filter.
88+
* @return the init parameters
89+
*/
90+
WebInitParam[] initParameters() default {};
91+
8492
/**
8593
* Whether the filter mappings should be matched after any declared Filter mappings of
8694
* the ServletContext.
@@ -95,6 +103,12 @@
95103
*/
96104
String[] servletNames() default {};
97105

106+
/**
107+
* Servlet types that the filter will be registered against.
108+
* @return the servlet types
109+
*/
110+
Class<?>[] servletRegistrationBeans() default {};
111+
98112
/**
99113
* URL patterns, as defined in the Servlet specification, that the filter will be
100114
* registered against.

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/ServletContextInitializerBeans.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import jakarta.servlet.Filter;
3636
import jakarta.servlet.MultipartConfigElement;
3737
import jakarta.servlet.Servlet;
38+
import jakarta.servlet.annotation.WebInitParam;
3839
import org.apache.commons.logging.Log;
3940
import org.apache.commons.logging.LogFactory;
4041

@@ -369,6 +370,21 @@ private void configureFromAnnotation(FilterRegistrationBean<Filter> bean, Filter
369370
if (registration.urlPatterns().length > 0) {
370371
bean.setUrlPatterns(Arrays.asList(registration.urlPatterns()));
371372
}
373+
for (WebInitParam param : registration.initParameters()) {
374+
bean.addInitParameter(param.name(), param.value());
375+
}
376+
377+
@SuppressWarnings("unchecked")
378+
Map<String, ServletRegistrationBean<?>> servletRegistrationBeans = (Map<String, ServletRegistrationBean<?>>) (Map<?, ?>) this.beanFactory
379+
.getBeansOfType(ServletRegistrationBean.class);
380+
381+
for (Class<?> servletClass : registration.servletRegistrationBeans()) {
382+
for (ServletRegistrationBean<?> registrationBean : servletRegistrationBeans.values()) {
383+
if (servletClass.isInstance(registrationBean.getServlet())) {
384+
bean.addServletRegistrationBeans(registrationBean);
385+
}
386+
}
387+
}
372388
}
373389

374390
}

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/ServletContextInitializerBeansTests.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import jakarta.servlet.ServletContext;
2424
import jakarta.servlet.ServletRequest;
2525
import jakarta.servlet.ServletResponse;
26+
import jakarta.servlet.annotation.WebInitParam;
2627
import jakarta.servlet.http.HttpServlet;
2728
import jakarta.servlet.http.HttpSessionIdListener;
2829
import org.assertj.core.api.ThrowingConsumer;
@@ -42,6 +43,7 @@
4243
*
4344
* @author Andy Wilkinson
4445
* @author Moritz Halbritter
46+
* @author Daeho Kwon
4547
*/
4648
class ServletContextInitializerBeansTests {
4749

@@ -136,6 +138,9 @@ void shouldApplyFilterRegistrationAnnotation() {
136138
assertThat(filterRegistrationBean.getServletNames()).containsExactly("test");
137139
assertThat(filterRegistrationBean.determineDispatcherTypes()).containsExactly(DispatcherType.ERROR);
138140
assertThat(filterRegistrationBean.getUrlPatterns()).containsExactly("/test/*");
141+
assertThat(filterRegistrationBean.getInitParameters()).containsEntry("env", "test")
142+
.containsEntry("debug", "true");
143+
139144
});
140145
}
141146

@@ -179,6 +184,25 @@ void shouldApplyOrderFromOrderAttribute() {
179184
.isEqualTo(ServletConfigurationWithAnnotationAndOrder.ORDER));
180185
}
181186

187+
@Test
188+
void shouldApplyServletRegistrationBeansInFilterRegistration() {
189+
load(FilterWithServletRegistrationBeansConfiguration.class);
190+
191+
ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
192+
this.context.getBeanFactory(), TestServletContextInitializer.class);
193+
194+
FilterRegistrationBean<?> frb = initializerBeans.stream()
195+
.filter(FilterRegistrationBean.class::isInstance)
196+
.map(FilterRegistrationBean.class::cast)
197+
.filter((f) -> "testFilter".equals(f.getFilterName()))
198+
.findFirst()
199+
.orElseThrow();
200+
201+
assertThat(frb.getServletRegistrationBeans()).hasSize(1);
202+
assertThat(frb.getServletRegistrationBeans().iterator().next().getServletName())
203+
.isEqualTo("testServletRegistrationBean");
204+
}
205+
182206
private void load(Class<?>... configuration) {
183207
this.context = new AnnotationConfigApplicationContext(configuration);
184208
}
@@ -280,7 +304,24 @@ static class FilterConfigurationWithAnnotation {
280304
@Bean
281305
@FilterRegistration(enabled = false, name = "test", asyncSupported = false,
282306
dispatcherTypes = DispatcherType.ERROR, matchAfter = true, servletNames = "test",
283-
urlPatterns = "/test/*")
307+
urlPatterns = "/test/*", initParameters = { @WebInitParam(name = "env", value = "test"),
308+
@WebInitParam(name = "debug", value = "true") })
309+
TestFilter testFilter() {
310+
return new TestFilter();
311+
}
312+
313+
}
314+
315+
@Configuration(proxyBeanMethods = false)
316+
static class FilterWithServletRegistrationBeansConfiguration {
317+
318+
@Bean
319+
ServletRegistrationBean<TestServlet> testServletRegistrationBean() {
320+
return new ServletRegistrationBean<>(new TestServlet(), "/test");
321+
}
322+
323+
@Bean
324+
@FilterRegistration(name = "testFilter", servletRegistrationBeans = TestServlet.class)
284325
TestFilter testFilter() {
285326
return new TestFilter();
286327
}

0 commit comments

Comments
 (0)