Skip to content

Commit 475a046

Browse files
committed
Merge pull request #45005 from kwondh5217
* pr/45005-squash: Polish "Add missing attributes to FilterRegistration annotation" Add missing attributes to FilterRegistration annotation Closes gh-45005
2 parents 75bc4b2 + 65de530 commit 475a046

File tree

3 files changed

+62
-3
lines changed

3 files changed

+62
-3
lines changed

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

+14
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 classes that the filter will be registered against.
108+
* @return the servlet classes
109+
*/
110+
Class<?>[] servletClasses() 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

+12
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

@@ -63,6 +64,7 @@
6364
* @author Phillip Webb
6465
* @author Brian Clozel
6566
* @author Moritz Halbritter
67+
* @author Daeho Kwon
6668
* @since 1.4.0
6769
*/
6870
public class ServletContextInitializerBeans extends AbstractCollection<ServletContextInitializer> {
@@ -362,6 +364,16 @@ private void configureFromAnnotation(FilterRegistrationBean<Filter> bean, Filter
362364
bean.setMatchAfter(registration.matchAfter());
363365
bean.setServletNames(Arrays.asList(registration.servletNames()));
364366
bean.setUrlPatterns(Arrays.asList(registration.urlPatterns()));
367+
for (WebInitParam param : registration.initParameters()) {
368+
bean.addInitParameter(param.name(), param.value());
369+
}
370+
this.beanFactory.getBeanProvider(ServletRegistrationBean.class).forEach((servletRegistrationBean) -> {
371+
for (Class<?> servletClass : registration.servletClasses()) {
372+
if (servletClass.isInstance(servletRegistrationBean.getServlet())) {
373+
bean.addServletRegistrationBeans(servletRegistrationBean);
374+
}
375+
}
376+
});
365377
}
366378

367379
}

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

+36-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
package org.springframework.boot.web.servlet;
1818

19+
import java.util.Collection;
1920
import java.util.EnumSet;
21+
import java.util.Map;
2022

2123
import jakarta.servlet.DispatcherType;
2224
import jakarta.servlet.Filter;
@@ -25,6 +27,7 @@
2527
import jakarta.servlet.ServletContext;
2628
import jakarta.servlet.ServletRequest;
2729
import jakarta.servlet.ServletResponse;
30+
import jakarta.servlet.annotation.WebInitParam;
2831
import jakarta.servlet.http.HttpServlet;
2932
import jakarta.servlet.http.HttpServletRequest;
3033
import jakarta.servlet.http.HttpServletResponse;
@@ -47,6 +50,7 @@
4750
*
4851
* @author Andy Wilkinson
4952
* @author Moritz Halbritter
53+
* @author Daeho Kwon
5054
*/
5155
class ServletContextInitializerBeansTests {
5256

@@ -141,6 +145,14 @@ void shouldApplyFilterRegistrationAnnotation() {
141145
assertThat(filterRegistrationBean.getServletNames()).containsExactly("test");
142146
assertThat(filterRegistrationBean.determineDispatcherTypes()).containsExactly(DispatcherType.ERROR);
143147
assertThat(filterRegistrationBean.getUrlPatterns()).containsExactly("/test/*");
148+
assertThat(filterRegistrationBean.getInitParameters())
149+
.containsExactlyInAnyOrderEntriesOf(Map.of("env", "test", "debug", "true"));
150+
Collection<ServletRegistrationBean<?>> servletRegistrationBeans = filterRegistrationBean
151+
.getServletRegistrationBeans();
152+
assertThat(servletRegistrationBeans).hasSize(1);
153+
assertThat(servletRegistrationBeans.iterator().next().getServletName())
154+
.isEqualTo("testServletRegistrationBean");
155+
144156
});
145157
}
146158

@@ -294,13 +306,34 @@ TestFilter testFilter() {
294306
static class FilterConfigurationWithAnnotation {
295307

296308
@Bean
297-
@FilterRegistration(enabled = false, name = "test", asyncSupported = false,
298-
dispatcherTypes = DispatcherType.ERROR, matchAfter = true, servletNames = "test",
299-
urlPatterns = "/test/*")
309+
@FilterRegistration(
310+
enabled = false, name = "test", asyncSupported = false, dispatcherTypes = DispatcherType.ERROR,
311+
matchAfter = true, servletNames = "test", urlPatterns = "/test/*", initParameters = {
312+
@WebInitParam(name = "env", value = "test"), @WebInitParam(name = "debug", value = "true") },
313+
servletClasses = { TestServlet.class })
300314
TestFilter testFilter() {
301315
return new TestFilter();
302316
}
303317

318+
@Bean
319+
ServletRegistrationBean<TestServlet> testServletRegistrationBean() {
320+
return new ServletRegistrationBean<>(new TestServlet());
321+
}
322+
323+
@Bean
324+
ServletRegistrationBean<NonMatchingServlet> nonMatchingServletRegistrationBean() {
325+
return new ServletRegistrationBean<>(new NonMatchingServlet());
326+
}
327+
328+
static class NonMatchingServlet extends HttpServlet implements ServletContextInitializer {
329+
330+
@Override
331+
public void onStartup(ServletContext servletContext) {
332+
333+
}
334+
335+
}
336+
304337
}
305338

306339
@Configuration(proxyBeanMethods = false)

0 commit comments

Comments
 (0)